EDA365电子论坛网
标题:
基于matlab GUI不变矩验证码识别
[打印本页]
作者:
thinkfunny
时间:
2021-5-24 14:41
标题:
基于matlab GUI不变矩验证码识别
k8 W0 Q6 W. P# x8 O8 X
一、简介
x4 e4 D- N' r/ t" W- {* n+ n
1 背景意义
- b0 [! \0 Z0 D$ [
验证码具有多变性特点,而当前的识别系统往往具有很强的针对性, 只能够识别某种类型的验证码。随着网络安全技术及验证码生成技术的不断发展,已经出现了更加复杂的验证码生成方法,如基于动态图像的验证码系统等。运用计算机视觉、模式识别等相关理论对多种不同类型的验证码进行识别研究。矩特征主要表征了图像区域的几何特征,又称为几何矩, 由于其具有旋转、平移、尺度等特性的不变特征,所以又称其为不变矩。
5 U& H, |( G3 e5 l0 U W# I$ _
- f4 f/ H, o$ A( k2 M" A+ U! m
2 理论基础
: e& q3 D* t$ G0 F4 G
本案例提出了以处理颜色加噪的数字字符为理论研究素材, 将模板匹配作为基本框架的验证码识别系统。本系统的优点在于能够对特定类型的数字验证码进行精确识别,实验中识别准确率可达到95%以上,并提供动态更新样本库的功能,可根据实际运行的环境提高验证码的识别率。
8 I& V J$ v7 v8 V! z' O
本案例选择了经典的数字验证码识别作为识别的对象。验证码的识别涉及图像预处理、分割、特征提取、识别等相关技术,本案例通过对彩色验证码图像进行灰度化、二值化、去噪和归一化等步骤来进行预处理,通过建立模板库的动态更新机制来提高系统的兼容性,进一步提升验证码识别的效率和准确性。
) V. \/ `+ I' W+ b- i5 n+ d5 w" k
流程图如下:
, h# X+ R1 J2 J1 X3 S
4.png
(42.07 KB, 下载次数: 8)
下载附件
保存到相册
2021-5-24 14:40 上传
$ m3 Q& f0 r u3 s4 o0 A& J$ T( N& K
t) C: }+ l7 ?1 \; y- |
3 算法流程
4 S- _, a! }* _3 }/ L# O2 s
为了进行验证码识别, 建立模板库建立动态模板库,加入自动更新的功能提高对数字验证码的识别率。数字验证码待识别对象即数字0 ~ 9,调用mkdir 函数来自动建立模板数据库文件夹。
. h; i" k: d: L3 I( K
由于图中有类似于椒盐噪声的带有颜色的噪声,数字验证码中的数字个数保持常量并且分布均匀、易于分割。因此,为了进行下一步的数字分割操作,需要先进行验证码图像去噪步骤。本案例采用颜色空间转换到hsv 的方式,用阈值过滤的手段进行去噪。进行图像去噪之后,可以发现验证码图像中的数字呈现分布均匀的状态,并且未明显受到倾斜、形变等因素的影响。借用数字图像二值化、积分投影的方式可对数字进行定位。在实际处理过程中,为了保证分割有效,加入了区域面积滤波操作,将剩余的噪声点进行滤除。为了进行下一步的识别操作,需要将分割结果进行归一化处理, 整合成固定维数的数字集合。数字图像分割完成后,通过提取数字图像的不变矩特征信息,与模板库中的数字图像
V. k; k( [: E- a* o k8 w8 P7 ~
进行对比,得到识别结果。
+ y" P; W5 u, t. H% q% H
8 U' ]! L, E4 g2 \7 k
二、源代码
0 j9 }6 C0 `# F' a
function varargout = daunxujian1(varargin)
% DAUNXUJIAN1 MATLAB code for daunxujian1.fig
% DAUNXUJIAN1, by itself, creates a new DAUNXUJIAN1 or raises the existing
% singleton*.
%
% H = DAUNXUJIAN1 returns the handle to a new DAUNXUJIAN1 or the handle to
% the existing singleton*.
%
% DAUNXUJIAN1('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in DAUNXUJIAN1.M with the given input arguments.
%
% DAUNXUJIAN1('Property','Value',...) creates a new DAUNXUJIAN1 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before daunxujian1_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to daunxujian1_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help daunxujian1
% Last Modified by GUIDE v2.5 23-Oct-2020 21:52:34
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @daunxujian1_OpeningFcn, ...
'gui_OutputFcn', @daunxujian1_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before daunxujian1 is made visible.
function daunxujian1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to daunxujian1 (see VARARGIN)
% Choose default command line output for daunxujian1
handles.output = hObject;
handles.Result = [];
handles.File = [];
% Update handles structure
guidata(hObject, handles);
clc; warning off all;
InitAxes(handles);
% UIWAIT makes daunxujian1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line.
function varargout = daunxujian1_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' },'载入图像',...
fullfile(pwd, 'images'));
I = imread(fullfile(pathname, filename));
Result = Process_Main(I);
handles.File = fullfile(pathname, filename);
handles.Result = Result;
guidata(hObject, handles);
InitAxes(handles)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if ~isempty(handles.Result)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');
axes(handles.axes2); imshow(handles.Result.Medfilt); title('中值滤波图像');
end
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if ~isempty(handles.Result)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');
axes(handles.axes2); imshow(handles.Result.Medfilt); title('中值滤波图像');
axes(handles.axes3); imshow(handles.Result.Normalize); title('归一化图像');
end
% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if ~isempty(handles.Result)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');
axes(handles.axes2); imshow(handles.Result.Medfilt); title('中值滤波图像');
axes(handles.axes3); imshow(handles.Result.Normalize); title('归一化图像');
axes(handles.axes4); imshow(handles.Result.Bww); title('二值化图像');
end
% --- Executes on button press in pushbutton6.
function pushbutton6_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if ~isempty(handles.Result)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');
axes(handles.axes2); imshow(handles.Result.Medfilt); title('中值滤波图像');
axes(handles.axes3); imshow(handles.Result.Normalize); title('归一化图像');
axes(handles.axes4); imshow(handles.Result.Bww); title('二值化图像');
axes(handles.axes6); imshow(handles.Result.Thin); title('细化处理');
axes(handles.axes5); imshow(handles.Result.Bw); title('特征提取');
hold on;
h = [];
for i = 1 : length(handles.Result.hs) %绘制水平线
h = [h plot([1 handles.Result.sz(2)], [handles.Result.hs(i) handles.Result.hs(i)], 'r-')];
end
for i = 1 : length(handles.Result.vs)%绘制竖直线
h = [h plot([handles.Result.vs(i) handles.Result.vs(i)], [1 handles.Result.sz(1)], 'g-')];
end
h = [h plot(handles.Result.x1, handles.Result.y1, 'y-')];%绘制左对角线
h = [h plot(handles.Result.x2, handles.Result.y2, 'm-')];%绘制右对角线
end
% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[filename, pathname] = uiputfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
'*.*','All Files' },'Save Image',...
fullfile(pwd, 'Result/result.png'));
if ~isequal(filename, 0)
imwrite(handles.Result.label, fullfile(pathname, filename));
msgbox('保存图像成功!', '信息提示框');
end
% --- Executes on button press in pushbutton9.
function pushbutton9_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton9 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
choice = questdlg('确定退出?', ...
'退出', ...
'是','否','否');
switch choice
case '是'
close;
otherwise
return;
end
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in pushbutton8.
function pushbutton8_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
set(handles.edit1,'string',handles.Result.label);
% --- Executes on button press in pushbutton10.
function pushbutton10_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton10 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if ~isempty(handles.Result)
axes(handles.axes1); imshow(handles.Result.Image); title('原图像');
axes(handles.axes2); imshow(handles.Result.Medfilt); title('中值滤波图像');
axes(handles.axes3); imshow(handles.Result.Normalize); title('归一化图像');
axes(handles.axes4); imshow(handles.Result.Bww); title('二值化图像');
axes(handles.axes6); imshow(handles.Result.Thin); title('细化处理');
end
( U8 u; o- @ w6 H1 I( Y
0 o. N1 x. B! r* n2 S% @. \
# f5 M4 z$ V( o7 N( ~
三、运行结果
& Q) o: u1 z1 n
$ Q0 E' U8 n- V- P8 e$ _
& l9 I) ]9 p" I x% e% ]
5.png
(29.81 KB, 下载次数: 8)
下载附件
保存到相册
2021-5-24 14:40 上传
8 u, y6 P, i; l! o) Y
作者:
regngfpcb
时间:
2021-5-24 16:00
基于matlab GUI不变矩验证码识别
作者:
yin123
时间:
2021-5-24 16:11
基于matlab GUI不变矩验证码识别
作者:
Henriete11
时间:
2021-5-24 16:12
基于matlab GUI不变矩验证码识别
作者:
opipo
时间:
2021-5-31 18:06
矩特征主要表征了图像区域的几何特征,又称为几何矩, 由于其具有旋转、平移、尺度等特性的不变特征,所以又称其为不变矩
' W% t# I6 R+ M( K: d
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2