首先,我们的眼睛接收,并将这张图片的信息输送给大脑;
然后,我们的大脑接收到这个图片信息以后,对这个图片信息作出处理;
最后,将图片中的有效信息提取出来再将其和大脑中储存的信息进行对应对比,确定对比结果。
类比验证码识别,大脑接受图片的处理过程就相当于电脑对图片的预处理,大脑对图片进行对比和确定结果就相当于电脑对验证码进行的识别。
1.验证码获取
clc; clear all; close all;
% 设置数据库文件路径
foldername = fullfile(pwd, 'Database');
if ~exist(foldername, 'dir');
mkdir(foldername);
end
% 采集数目
N = 1000;
seed = 10;
for i = 1 : N
filenamei = fullfile(foldername, sprintf('%04d.jpg', i))
% 获取指定的验证码
Img = get_yzm(seed);
imwrite(Img, filenamei);
end
2.创建标准字符库
clc; clear all; close all;
% 设置生成路径
foldername_out = fullfile(pwd, 'model_out');
if ~exist(foldername_out, 'dir');
mkdir(foldername_out);
end
% 上下左右有效区域
th = [3 17 5 56];
for k = 1 : 6
% 读取模型
filename = fullfile(pwd, 'model', sprintf('%d.jpg', k))
Img = imread(filename);
% 颜色分割
hsv = rgb2hsv(Img);
I = hsv(:,:,3);
I = im2uint8(mat2gray(I));
% 反色
I = imcomplement(I);
% 阈值分割
thresh = graythresh(I);
if thresh < 0.4
thresh = 0.5;
end
% 二值化
bw = im2bw(I, thresh);
% 去除小的杂点
bw = bwareaopen(bw, 7);
% 区域分割(把验证码之外的区域去除)
bw(1:th(1), :) = 0;
bw(th(2):end, :) = 0;
bw(:, 1:th(3)) = 0;
bw(:, th(4):end) = 0;
% 区域标记
[L, num] = bwlabel(bw);
% 区域分割
stats = regionprops(L);
for i = 1 : num
% 分别提取
rect = stats(i).BoundingBox;
bwi = bw;
bwi(L ~= i) = 0;
% 裁剪出字符
bwi = imcrop(bwi, rect);
% 写出
filename_out = fullfile(foldername_out, sprintf('%d_%d.jpg', k, i));
imwrite(bwi, filename_out);
end
end
3.验证码识别
clc; clear all; close all;
% 加载模板
foldername = fullfile(pwd, 'mask');
filename_list = ls(fullfile(foldername, '*.jpg'));
N = size(filename_list, 1);
for i = 1 : N
filename = fullfile(foldername, strtrim(filename_list(i, :)));
bw = imread(filename);
% 二值化
bw = im2bw(bw);
[ri, ci] = find(bw);
%验证码定位与裁剪
recti = [min(ci) min(ri) max(ci)-min(ci) max(ri)-min(ri)];
bw = imcrop(bw, recti);
% 提取特征用于识别(自定义函数)
phi = featureextract(bw);
% 提取第一个字符作为标识
[~, name, ~] = fileparts(filename);
word.bw = bw;
word.phi = phi;
word.Width = max(ci) - min(ci);
word.Char = name(1);
words(i) = word;
end
% 获取指定验证码
% k = 15;
% filename = fullfile(pwd, 'Database', sprintf('%04d.jpg', k))
% Img = imread(filename);
% Img = imread('c:/a.jpg');
% 在线获取验证码
Img = get_yzm();
% 图像分割
th = [3 17 5 56];
hsv = rgb2hsv(Img);
I = hsv(:,:,3);
I = im2uint8(mat2gray(I));
I = imcomplement(I);
thresh = graythresh(I);
if thresh < 0.4
thresh = 0.5;
end
bw = im2bw(I, thresh);
bw = bwareaopen(bw, 7);
bw(1:th(1), :) = 0;
bw(th(2):end, :) = 0;
bw(:, 1:th(3)) = 0;
bw(:, th(4):end) = 0;
%区域标记与分割
[L, num] = bwlabel(bw);
stats = regionprops(L);
result = [];
for i = 1 : num
rect = stats(i).BoundingBox;
bwi = bw;
bwi(L ~= i) = 0;
bwi = imcrop(bwi, rect);
[ri, ci] = find(bwi);
recti = [min(ci) min(ri) max(ci)-min(ci) max(ri)-min(ri)];
bwi = imcrop(bwi, recti);
phi = featureextract(bwi);
for j = 1 : length(words)
dis(j) = norm(phi - words(j).phi);
end
[~, ind_min_dis] = min(dis);
result = [result words(ind_min_dis).Char];
end
figure('Color', 'w');
subplot(2, 1, 1); imshow(Img, []); title('验证码图像');
subplot(2, 1, 2); imshow(bw, []); title(result, 'FontWeight', 'Bold', 'FontSize', 16, 'Color', 'r');