验证码识别

验证码识别过程好比人大脑的一个识别过程 。
首先,我们的眼睛接收,并将这张图片的信息输送给大脑;
然后,我们的大脑接收到这个图片信息以后,对这个图片信息作出处理;
最后,将图片中的有效信息提取出来再将其和大脑中储存的信息进行对应对比,确定对比结果。

类比验证码识别,大脑接受图片的处理过程就相当于电脑对图片的预处理,大脑对图片进行对比和确定结果就相当于电脑对验证码进行的识别。


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');

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值