边缘检测基于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期