计算机视觉:matlab实现9种边缘检测算子

9种边缘算子

  • Canny算子
  • Sobel算子
  • Susan算子
  • Prewitt算子
  • Laplace算子
  • LOG算子
  • Roberts算子
  • Kirsch算子
  • 普通梯度方法

其中,
roberts,canny,sobel,log,prewitt在matlab中都可直接用一行代码来实现:

BW = edge(I,method,threshold)

main.m

clc; clear; close all;
Img = imread('CXK.png');
Img=rgb2gray(Img);

Img_canny = edge(Img,'canny');  %canny
Img_roberts = edge(Img,'roberts');  %reberts
Img_prewitt = edge(Img,'prewitt');  %prewitt
Img_sobel=edge(Img,'sobel');  %sobel
Img_log=edge(Img,'log');  %log
Img_lap=laplace(Img,0.05);  %laplace
Img_susan=susan(Img,0.2);  %susan
Img_kir=kirsch(Img);  %kirsch
[Img_x,Img_y,Img_t]=grd(Img);  %普通梯度法


figure();
subplot(231);imshow(Img_lap);title('laplace');
subplot(232);imshow(Img_log);title('log');
subplot(233);imshow(Img_canny);title('canny');
subplot(234);imshow(Img_prewitt);title('prewitt');
subplot(235);imshow(Img_sobel);title('sobel');
subplot(236);imshow(Img_roberts);title('roberts');

figure();
subplot(1,2,1);imshow(Img);title('原图');
subplot(1,2,2);imshow(Img_kir);title('kirsch');

figure();
subplot(1,2,1);imshow(Img);title('原图');
subplot(1,2,2);imshow(Img_susan);title('susan');

figure()
subplot(1,3,1);imshow(Img_x);title('gradient-x');
subplot(1,3,2);imshow(Img_y);title('gradient-y');
subplot(1,3,3);imshow(Img_t);title('gradient-t');

susan.m

function image_out = susan(im,threshold)
% 功能:实现运用SUNSAN算子进行边缘检测
% 输入:image_in-输入的待检测的图像
%       threshold-阈值
% 输出:image_out-检测边缘出的二值图像
 
% 将输入的图像矩阵转换成double型
d = length(size(im));
if d==3
    image=double(rgb2gray(im));
elseif d==2
    image=double(im);
end
 
% 建立SUSAN模板
 
mask = ([ 0 0 1 1 1 0 0 ;0 1 1 1 1 1 0;1 1 1 1 1 1 1;1 1 1 1 1 1 1;1 1 1 1 1 1 1;0 1 1 1 1 1 0;0 0 1 1 1 0 0]);  
 
R=zeros(size(image));
% 定义USAN 区域
nmax = 3*37/4;
 
 [a b]=size(image);
new=zeros(a+7,b+7);
[c d]=size(new);
new(4:c-4,4:d-4)=image;
  
for i=4:c-4
    
    for j=4:d-4
        
        current_image = new(i-3:i+3,j-3:j+3);
        current_masked_image = mask.*current_image;
   
%   调用susan_threshold函数进行阈值比较处理
                
        current_thresholded = susan_threshold(current_masked_image,threshold);
        g=sum(current_thresholded(:));
        
        if nmax

susan_threshold.m

function thresholded = susan_threshold(image,threshold)
% 功能:设定SUSAN算法的阈值
 
[a b]=size(image);
intensity_center = image((a+1)/2,(b+1)/2);
 
temp1 = (image-intensity_center)/threshold;
temp2 = temp1.^6;
thresholded = exp(-1*temp2);

kirsch.m

function Img_kir=kirsch(Img)
%---------------------------------------------------------------
%对图象进行预处理

%对图象进行均值滤波
Img2=filter2(fspecial('average',3),Img);

%对图象进行高斯滤波
Img3=filter2(fspecial('gaussian'),Img2);

%利用小波变换对图象进行降噪处理
[thr,sorh,keepapp]=ddencmp('den','wv',Img3);     %获得除噪的缺省参数
Img4=wdencmp('gbl',Img3,'sym4',2,thr,sorh,keepapp);%图象进行降噪处理

%---------------------------------------------------------------------
%提取图象边缘
t=[0.8 1.0 1.5 2.0 2.5].*10^5 ;     %设定阈值
Img5=double(Img4);            
[m,n]=size(Img5);             
g=zeros(m,n); 
d=zeros(1,8);
%利用Kirsch算子进行边缘提取
for i=2:m-1
   for j=2:n-1
       d(1) =(5*Img5(i-1,j-1)+5*Img5(i-1,j)+5*Img5(i-1,j+1)-3*Img5(i,j-1)-3*Img5(i,j+1)-3*Img5(i+1,j-1)-3*Img5(i+1,j)-3*Img5(i+1,j+1))^2; 
       d(2) =((-3)*Img5(i-1,j-1)+5*Img5(i-1,j)+5*Img5(i-1,j+1)-3*Img5(i,j-1)+5*Img5(i,j+1)-3*Img5(i+1,j-1)-3*Img5(i+1,j)-3*Img5(i+1,j+1))^2; 
       d(3) =((-3)*Img5(i-1,j-1)-3*Img5(i-1,j)+5*Img5(i-1,j+1)-3*Img5(i,j-1)+5*Img5(i,j+1)-3*Img5(i+1,j-1)-3*Img5(i+1,j)+5*Img5(i+1,j+1))^2; 
       d(4) =((-3)*Img5(i-1,j-1)-3*Img5(i-1,j)-3*Img5(i-1,j+1)-3*Img5(i,j-1)+5*Img5(i,j+1)-3*Img5(i+1,j-1)+5*Img5(i+1,j)+5*Img5(i+1,j+1))^2; 
       d(5) =((-3)*Img5(i-1,j-1)-3*Img5(i-1,j)-3*Img5(i-1,j+1)-3*Img5(i,j-1)-3*Img5(i,j+1)+5*Img5(i+1,j-1)+5*Img5(i+1,j)+5*Img5(i+1,j+1))^2; 
       d(6) =((-3)*Img5(i-1,j-1)-3*Img5(i-1,j)-3*Img5(i-1,j+1)+5*Img5(i,j-1)-3*Img5(i,j+1)+5*Img5(i+1,j-1)+5*Img5(i+1,j)-3*Img5(i+1,j+1))^2; 
       d(7) =(5*Img5(i-1,j-1)-3*Img5(i-1,j)-3*Img5(i-1,j+1)+5*Img5(i,j-1)-3*Img5(i,j+1)+5*Img5(i+1,j-1)-3*Img5(i+1,j)-3*Img5(i+1,j+1))^2; 
       d(8) =(5*Img5(i-1,j-1)+5*Img5(i-1,j)-3*Img5(i-1,j+1)+5*Img5(i,j-1)-3*Img5(i,j+1)-3*Img5(i+1,j-1)-3*Img5(i+1,j)-3*Img5(i+1,j+1))^2;      
       g(i,j) = max(d);
    end
end

%显示边缘提取后的图象
for k=1:5
    for i=1:m
        for j=1:n
            if g(i,j)>t(k)
                Img_kir(i,j)=255;           
            else
                Img_kir(i,j)=0;
            end
        end
    end
end

laplace.m

function Img_lap=laplace(Img,threshold)

lenna_3=mat2gray(Img);   %图像矩阵的归一化
[m,n]=size(lenna_3);
lenna_4=lenna_3;       %保留图像的边缘一个像素
L=0;
t=threshold;          %设定阈值
%Laplace算子
for j=2:m-1 
    for k=2:n-1
        L=abs(4*lenna_3(j,k)-lenna_3(j-1,k)-lenna_3(j+1,k)-lenna_3(j,k+1)-lenna_3(j,k-1));
        if(L > t)
            Img_lap(j,k)=255;  %白
        else
            Img_lap(j,k)=0;    %黑
        end
    end
end

grd.m

function [Img_x,Img_y,Img_t]=grd(Img)
I=double(Img);
[x, y]=gradient(I);
t=sqrt(x.^2+y.^2);
Img_x=I;Img_y=I;Img_t=I;
Img_t(t>10)=255;
Img_t(t<10)=0;
%figure,imshow(G);title('gradient-t');
Img_x(x>2)=255;
Img_x(x<2)=0;
%figure,imshow(G);title('gradient-x');
Img_y(y>2)=255;
Img_y(y<2)=0;
%figure,imshow(G);title('gradient-y');

使用的原图如下:


计算机视觉:matlab实现9种边缘检测算子_第1张图片
CXK.png

结果如下:


计算机视觉:matlab实现9种边缘检测算子_第2张图片
laplace,log,canny,prewitt,sobel,roberts
计算机视觉:matlab实现9种边缘检测算子_第3张图片
kirsch
计算机视觉:matlab实现9种边缘检测算子_第4张图片
普通梯度法

参考博客:
1.图像边缘检测及提取方法总结(含Matlab代码)
2.图像边缘检测——二阶微分算子(上)Laplace算子、LOG算子、DOG算子(Matlab实现)
3.常用边缘检测算子比较
4.图像处理特征不变算子系列之SUSAN算子(三)
侵权删。

另外附上彩蛋:GIF逐帧检测识别

计算机视觉:matlab实现9种边缘检测算子_第5张图片
CXK_dt2.gif

gif_detect.m

path = 'CXK2.gif';

for i=1:80  %取其中1-80帧
    frame = imread(path,'gif','frame',i);
    frame_edge = edge(frame,'roberts');
    [I,map]=gray2ind(frame_edge,256);
    if(i==1)
        imwrite(I,map,'CXK_dt2.gif','DelayTime',0.1,'LoopCount',Inf)
    else
        imwrite(I,map,'CXK_dt2.gif','WriteMode','append','DelayTime',0.1)    
    end
end

你可能感兴趣的:(计算机视觉:matlab实现9种边缘检测算子)