1 简介
模型参考这里。
2 源代码
%文件名称: 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');
3 仿真结果
4 参考文献
[1]张闯, 迟健男, 张朝晖,等. 一种基于CNN的彩色图像边缘检测算法[J]. 计算机工程与应用, 2008(21):17-19.