C/C++教程

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

本文主要是介绍【边缘检测】基于CNN的灰度图像边缘提取matlab源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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 仿真结果

img

img

4 参考文献

[1]张闯, 迟健男, 张朝晖,等. 一种基于CNN的彩色图像边缘检测算法[J]. 计算机工程与应用, 2008(21):17-19.

这篇关于【边缘检测】基于CNN的灰度图像边缘提取matlab源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!