【第 10 章 基于不变矩的某网站数字验证码识别MATLAB深度学习实战应用案例】

该博客介绍了使用MATLAB进行数字验证码识别的深度学习案例,通过不变矩特征提取和图像处理技术提高识别准确性。文章提供GUI界面展示,并包含用于计算不变矩的invmoments函数及遍历文件夹获取图像的GetAllFiles函数。同时,展示了GetDatabase函数,用于处理图像并创建模板库。案例中,图像首先转换为灰度,再进行二值化和形态学操作,提取字符并保存为模板。
摘要由CSDN通过智能技术生成

【第 10 章 基于不变矩的数字验证码识别MATLAB深度学习实战应用案例】

GUI界面效果如图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中的子函数
invmoments.m文件

function res = invmoments(x)

x = double(x);
[M,N,~] = size(x);
[X,Y] = meshgrid(1:M, 1:N);
X = X(:);
Y = Y(:);
x = x(:);
m.m00 = sum(x);
m.m10 = sum(X.*x);
m.m01 = sum(Y.*x);
m.m11 = sum(X.*Y.*x);
m.m20 = sum(X.^2.*x);
m.m02 = sum(Y.^2.*x);
m.m30 = sum(X.^3.*x);
m.m03 = sum(Y.^3.*x);
m.m12 = sum(X.*Y.^2.*x);
m.m21 = sum(X.^2.*Y.*x);
xbar = m.m10/m.m00;
ybar = m.m01/m.m00;
e.hp11 = (m.m11 - ybar*m.m10) / m.m00^2;
e.hp20 = (m.m20 - xbar*m.m10) / m.m00^2;
e.hp02 = (m.m02 - ybar*m.m01) / m.m00^2;
e.hp30 = (m.m30 - 3*xbar*m.m20 + 2*xbar^2*m.m10) / m.m00^2.5;
e.hp03 = (m.m03 - 3*ybar*m.m02 + 2*ybar^2*m.m01) / m.m00^2.5;
e.hp21 = (m.m21 - 2*xbar*m.m11 -ybar*m.m20 + 2*xbar^2*m.m01) / m.m00^2.5;
e.hp12 =  (m.m12 - 2*ybar*m.m11 -xbar*m.m02 + 2*ybar^2*m.m10) / m.m00^2.5;
res(1) = e.hp20 + e.hp02;
res(2) = (e.hp20 - e.hp02)^2 + 4*e.hp11^2;
res(3) = (e.hp30 - 3*e.hp12)^2 + (3*e.hp21 - e.hp03)^2;
res(4) = (e.hp30 + e.hp12)^2 + (e.hp21 + e.hp03)^2;
res(5) = (e.hp30 - 3*e.hp12)*(e.hp30 + e.hp12)*...
    ((e.hp30 + e.hp12)^2 - 3*(e.hp21 + e.hp03)^2)+...
    (3*e.hp21 - e.hp03)*(e.hp21 + e.hp03)*...
    (3*(e.hp30 + e.hp12)^2 - (e.hp21 + e.hp03)^2);
res(6) = (e.hp20 - e.hp02) * ((e.hp30 + e.hp12)^2-...
    (e.hp21 + e.hp03)^2)+...
    4*e.hp11*(e.hp30 + e.hp12)*(e.hp21 + e.hp03);
res(7) = (3*e.hp21 - e.hp03) * (e.hp30 + e.hp12) * ...
    ( (e.hp30 + e.hp12)^2 - 3*(e.hp21 + e.hp03)^2) +...
    (3*e.hp12 - e.hp30)*(e.hp21 + e.hp03)*...
    (3*(e.hp30 + e.hp12)^2 - (e.hp21 + e.hp03)^2);

子函数GetAllFiles.m

function fileList = GetAllFiles(dirName)

dirData = dir(dirName);    
dirIndex = [dirData.isdir]; 
fileList = {dirData(~dirIndex).name}'; 
if ~isempty(fileList)
    fileList = cellfun(@(x) fullfile(dirName,x),... 
        fileList,'UniformOutput',false);
end
subDirs = {dirData(dirIndex).name}; 
validIndex = ~ismember(subDirs,{'.','..'}); 
for iDir = find(validIndex)              
    nextDir = fullfile(dirName,subDirs{iDir});   
    fileList = [fileList; GetAllFiles(nextDir)];
end

end

函数
GetDatabase

function GetDatabase()
files = dir(fullfile(pwd, 'images/*.jpg'));
for i = 0 : 9
    foldername = fullfile(pwd, sprintf('Databse/%d', i));
    if ~exist(foldername, 'dir')
        mkdir(foldername);
    end
end
h = waitbar(0,'正在处理,请等待...', 'Name', '生成模板库');
steps = length(files);

for fi = 1 : length(files)
    filename = fullfile(pwd, sprintf('images/%s', files(fi).name));
    [pathstr, name, ext] = fileparts(filename);
    name = name(1:4);
    Img = imread(filename);   
    hsv = rgb2hsv(Img);
    h = hsv(:, :, 1);
    s = hsv(:, :, 2);
    v = hsv(:, :, 3);
    bw1 = h > 0.16 & h < 0.30;
    bw2 = s > 0.65 & s < 0.80;
    bw = bw1 & bw2;
    Imgr = Img(:, :, 1);
    Imgg = Img(:, :, 2);
    Imgb = Img(:, :, 3);
    Imgr(bw) = 255;
    Imgg(bw) = 255;
    Imgb(bw) = 255;
    Imgbw = cat(3, Imgr, Imgg, Imgb);
    Ig = rgb2gray(Imgbw);
    Ibw = im2bw(Ig, 0.8);
    sz = size(Ibw);
    cs = sum(Ibw, 1);
    mincs = min(cs);
    maxcs = max(cs);
    masksize = 16;
    S1 = []; E1 = [];
    flag = 1;
    s1 = 1;
    tol = maxcs;
    
    while s1 < sz(2)
        for i = s1 : sz(2)
            s2 = i;
            if cs(s2) < tol && flag == 1
                flag = 2;
                S1 = [S1 s2-1];
                break;
            elseif cs(s2) >= tol && flag == 2
                flag = 1;
                E1 = [E1 s2];
                break;
            end
        end
        s1 = s2 + 1;
    end
    Ibw = ~Ibw;
    Ibw = bwmorph(Ibw, 'thin', inf);
    for i = 1 : length(S1)
        Ibwi = Ibw(:, S1(i):E1(i));
        [L, num] = bwlabel(Ibwi);
        stats = regionprops(L);
        Ar = cat(1, stats.Area);
        [maxAr, ind_maxAr] = max(Ar);
        recti = stats(ind_maxAr).BoundingBox;
        recti(1) = recti(1) + S1(i) - 1;
        recti(2) = recti(2);
        recti(3) = recti(3);
        recti(4) = recti(4);
        Ibwi = imcrop(Ibw, recti);
        rate = masksize/max(size(Ibwi));
        Ibwi = imresize(Ibwi, rate, 'bilinear');
        ti = zeros(masksize, masksize);
        rsti = round((size(ti, 1)-size(Ibwi, 1))/2);
        csti = round((size(ti, 2)-size(Ibwi, 2))/2);
        ti(rsti+1:rsti+size(Ibwi,1), csti+1:csti+size(Ibwi,2))=Ibwi;
        Ti{i} = ti;
    end
    for i = 1 : length(Ti)
        namei = name(i);
        outfilenamei = fullfile(pwd, sprintf('Databse/%s/%s_%d_%d.jpg', namei, namei, fi, i));
        imwrite(Ti{i}, outfilenamei);
    end
    fprintf('\n已处理%d------%d\n', fi, length(files));
    h = waitbar(fi / steps);
end
close(h) ;

数据库
在这里插入图片描述
案例图像
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
准确度较高啊
在这里插入图片描述

本文全文源码下载[链接–>传送门]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海宝7号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值