Matlab神经网络验证码识别

本文介绍如何使用Matlab结合神经网络(BP网络和深度卷积网络)处理验证码识别问题。首先,对图像进行预处理,包括二值化、切割和格式转换。接着,构建BP网络和深度卷积网络模型进行识别,其中BP网络采用三层结构,深度卷积网络利用下载的深度学习工具包。尽管BP网络的识别正确率为70%,但整体表现出较高的识别效果。
摘要由CSDN通过智能技术生成

本文,将会简述如何利用Matlab的强大功能,调用神经网络处理验证码的识别问题。
预备知识,Matlab基础编程,神经网络基础。
可以先看下:

Matlab基础视频教程

Matlab经典教程——从入门到精通

神经网络入门

验证码识别原理

Matlab对图像读入处理,去掉噪声点和较浅的点,进行二值化,将图像转变为0/1矩阵,这样就完成了预处理。
然后要对图像进行切割,取到每个数字的小图片位置,将其缩放至等大小,方便神经网络进一步处理。
最后将图片转成神经网络能够识别的格式,例如BP网络,则将其转为行向量,深卷积网络,则将其转为矩阵即可。

识别预处理

Matlab对验证码的识别是基于神经网络的,但预处理工作还是占了整体工作的大半,将数据整理好并处理成对应可用的格式,问题就简单了很多。
Matlab的一大缺陷是不注重数据结构,其结构体无比难用,所以我们这里将尽可能使用矩阵进行处理,而参数较多时,我们也只是简单的将其放入到元胞数组中,不优雅之处,敬请见谅。

首先介绍一下matlab的图像基本处理函数:

img = imread('path') # 返回一个图像的矩阵,其每个元素的值,包含rgb三个通道的数据。
imshow(img) # 显示图像
imgGray = rgb2gray(img) # 转为灰度图像
thresh = graythresh(imgGray); % 自动确定二值化阀值
BW = 1 - im2bw(imgGray,thresh);   % 二值化,且取反,黑的部分是0,白的部分是1,
I2 = bwareaopen(BW, 8, 8);   % 去除连通分量中小于10的离散点

我们看看目标的图片:
这里写图片描述

有很多随机的像素点干扰,我们需要将这些像素点去除,然后进行图像切割。

切割图片实际上很简单,就是对图片中每行每列进行统计,然后将形成的波形进行扫描,每个从0上升又下降到0的区域,就是一个字符。

这里写图片描述

切割后的图片:

这里写图片描述

下面我们来写一个完整的函数分割器函数,为了检测正确性,我们这里提供了isshow标记,如果设置为true,将会打印中间的调试信息。


% 图片分割器

function y = cutting(img, isshow)
    if nargin < 2; isshow = false; end
    if isshow;
        imshow(img); % 显示彩色图像
    end
    imgGray = rgb2gray(img); % 转为灰度图像

    thresh = graythresh(imgGray); % 自动确定二值化阀值 (这个不太好,有时会整体删除一个字)
    BW = 1 - im2bw(imgGray,thresh);   % 二值化
    I2 = bwareaopen(BW, 8, 8);   % 去除连通分量中小于10的离散点

    varray = sum(I2); 
    imgsize = size(I2);

    if isshow
        figure; % 打开一个新的窗口显示灰度图像
        imshow(imgGray); % 显示转化后的灰度图像

        harray = sum(I2');
        x1 = 1 : imgsize(1, 1);
        x2 = 1 : imgsize(1, 2);
        figure; % 打开一个新的窗口显示分割图
        plot(x1, harray, 'r+-', x2, varray, 'y*-');

        figure; % 打开一个新的窗口显示灰度图像
        imshow(I2); % 显示转化后的灰度图像
    end

    va = mean(varray);    % 计算平均值
    harray = sum(I2'); 
    vb = mean(harray);

    %% matlab 设计的实在太烂!真是我有史以来见过的最烂的语言
    %% 函数只有搅成一坨的情况下才能正确运行
    %% 他们根部不知道如何用闭包,以及合理的封装对象

    isanum = false; 
    sumy = 0;
    for i = 1 : imgsize(1, 1)
        if harray(i) > vb;
            if isanum == false;
                isanum = true;
                cvb = i;
            end
        else
            if isanum;
                isanum = false;
                cve
验证码识别是一个比较经典的图像识别问题,基于神经网络的方法可以用来解决这个问题。下面是一个基于神经网络Matlab 验证码识别的大致流程: 1. 数据处理:首先需要将验证码图片进行处理,将其转换为数字矩阵,可以使用 Matlab 的 imread 函数读取验证码图片,然后使用 rgb2gray 函数将图片转换为灰度图像。接着使用 im2bw 函数将灰度图像转换为二值图像,使得图片更加容易处理。 2. 特征提取:接下来需要对图片进行特征提取,将其转换为数字矩阵。可以使用 Matlab 的 regionprops 函数来提取图片中的连通区域,然后使用 bwlabel 函数将这些连通区域标记出来。接着,可以按照位置顺序将这些标记区域拼接在一起,得到一个数字矩阵。 3. 网络训练:使用 Matlab 自带的神经网络工具箱,可以构建一个简单的全连接神经网络,将验证码数字矩阵作为输入,对应的数字作为输出。然后使用一些验证码数据对网络进行训练,使得网络能够学会正确识别验证码数字。 4. 预测与测试:训练好网络之后,就可以使用它对新的验证码进行识别。将验证码图片按照前面的处理方法转换为数字矩阵,然后输入到训练好的网络中,得到对应的数字输出。最后将这些数字拼接在一起,得到识别出来的验证码。 需要注意的是,验证码识别是一个比较复杂的问题,需要一定的图像处理和机器学习知识,同时也需要一定的数据量和时间来训练网络。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值