边缘检测基于CNN的灰度图像边缘提取matlab源码

Posted Matlab走起

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了边缘检测基于CNN的灰度图像边缘提取matlab源码相关的知识,希望对你有一定的参考价值。

一、简介


关于什么是卷积神经网络(CNN),请自行查阅资料进行学习。如果是初学者,这里推荐一下台湾的李宏毅的深度学习课程。链接就不给了,这些资料网站上随处可见。

值得一提的是,CNN虽然在图像处理的领域具有不可阻挡的势头,但是它绝对不仅仅只能用来图像处理领域,大家熟知的alphaGo下围棋也可以通过CNN的结构进行处理,因为下围棋与图像有着相似之处,所以说,CNN提供给我们的是一种处理问题的思想,有学者归纳出了可以用CNN解决的问题所具备的三个性质:

局部性
对于一张图片而言,需要检测图片中的特征来决定图片的类别,通常情况下这些特征都不是由整张图片决定的,而是由一些局部的区域决定的。例如在某张图片中的某个局部检测出了鸟喙,那么基本可以判定图片中有鸟这种动物。

相同性
对于不同的图片,它们具有同样的特征,这些特征会出现在图片的不同位置,也就是说可以用同样的检测模式去检测不同图片的相同特征,只不过这些特征处于图片中不同的位置,但是特征检测所做的操作几乎一样。例如在不同的图片中,虽然鸟喙处于不同的位置,但是我们可以用相同的模式去检测。

不变性
对于一张图片,如果我们进行下采样,那么图片的性质基本保持不变。

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


二、源代码

%文件名称:  CNN_Edge_extraction.m
%文件描述:  基于CNN的灰度图像边缘提取的程序
%创 
%参考文献: 《基于细胞神经网络的图像边缘提取算法研究》
%             

clear;
clc;

I=imread('C:\\Users\\lenovo\\Desktop\\d083bc186611b136d0e72beeccee8850\\CNN边缘检测\\lena.jpg');
[c,d]=size(I);
x=zeros(c,d);

for i=1:c;
    for j=1:d;
        n(i,j)=double(I(i,j))/255;
        s(i,j)=2*(n(i,j)-0.5);
    end
end
A=[0 0 0;
   0 1.600 0;
   0 0 0];
B=[-1.004 -1.004 -1.004;
   -1.004 10.000 -1.004;
   -1.004 -1.004 -1.004];
z=-1.405;

% A=[0 0 0;
%    0 2 0;
%    0 0 0];
% B=[-1 -1 -1;
%    -1  8 -1;
%    -1 -1 -1];
% z=-0.5;

% A=[0 0 0;
%    0 9.926055 0;
%    0 0 0];
% B=[-1.124332 -1.124332 -1.124332;
%    -1.124332  9.670411 -1.124332;
%    -1.124332 -1.124332 -1.124332];
% z=-1.915585;

circlenumber=0; %circlenumber是细胞神经网络要循环的次数
judge=0;        %judge是判断网络稳定的标志,
                %0是网络未达到稳定的标志,
                %1表示网络已经稳定了

%当所有的状态x(i,j)的绝对值都大于1的时候,就认为网络趋于稳定
%下面是计算过程,直接迭代到完全收敛
while judge==0
    circlenumber=circlenumber+1;
    for i=2:c-1     %求出各个输出的值
        for j=2:d-1
            if x(i,j)>=1      %求f(x(i,j))的值,设置为f(i,j)
                f(i,j)=1;     %表示正向稳定时,取白色
            elseif x(i,j)<=-1
                f(i,j)=-1;    %表示负向稳定时,取黑色
            else
                f(i,j)=x(i,j);%未稳定时,将状态直接输出
            end
        y(i,j)=f(i,j);        %无论是否稳定,都将结果先直接输出
        end
    end
    %其中边界条件是在图像外面的像素都设置为0;
    %这里是将上面两行,下面两行,还有左右两行都设置成边界
    %正式的处理单元是中间2到257行和2到257列的部分
    for i=2:c-1
        for j=2:d-1
            xn(i,j)=z+A(2,2)*y(i,j)+B(2,2)*s(i,j)+B(1,1)*s(i-1,j-1)...
            +B(1,2)*s(i-1,j)+B(1,3)*s(i-1,j+1)+B(2,1)*s(i,j-1)+B(2,3)...
            *s(i,j+1)+B(3,1)*s(i+1,j-1)+B(3,2)*s(i+1,j)+B(3,3)*s(i+1,j+1);
            %以上语句对应于CNN的公式,详见《细胞网络神经动力学》p5
        end
    end
    %以下判断是不是已经全部收敛了,如果全部收敛了,就置judge=1
    judge=1;
    for i=2:c-1
        for j=2:d-1
            if abs(xn(i,j))<1
                judge = 0;
            end
        end
    end
    %以下将xn(i,j)赋值给状态x(i,j)
    for i=2:c-1
        for j=2:d-1
            x(i,j)=xn(i,j);
        end
    end
end


%接下去跳出wile循环,表示已经稳定了
%以下进行边缘的确定,f(i,j)=1对应的像素值设为1,
%f(i,j)=-1对应的像素值设为0
a=zeros(c,d);
for i=2:c-1
    for j=2:d-1
        if x(i,j)>=1
            a(i,j)=1;
        elseif x(i,j)<=-1
            a(i,j)=0;
        end
    end
end

%以下输出原始图像和边缘图像a
figure(1);imshow(I);
title('原始图像');
%以下输出y(i,j)状态图
figure(2);
imshow(a);
title('lena的CNN状态图');
imwrite(a,'lena_cnn.png','png');

四、备注

 

完整代码或者仿真咨询QQ1575304183

以上是关于边缘检测基于CNN的灰度图像边缘提取matlab源码的主要内容,如果未能解决你的问题,请参考以下文章

图像边缘检测基于matlab灰度图像的积累加权边缘检测含Matlab源码 2010期

数字图像处理课程设计(基于matlab的Hough变换检测图像边缘提取,包含完整代码)

图像边缘检测基于matlab自适应阈值的八方向和四方向sobel图像边缘检测含Matlab源码 2058期

图像边缘检测基于matlab自适应阈值的八方向和四方向sobel图像边缘检测含Matlab源码 2058期

基于MATLAB的Sobel边缘检测算法实现

图像处理基于灰度矩的亚像素边缘检测方法理论及MATLAB实现