计算机视觉: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<g
            R(i,j) = g-nmax;
        else
            R(i,j) = 0;
        end
    end
end
 
image_out=R(4:c-4,4:d-4);

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');

使用的原图如下:


CXK.png

结果如下:


laplace,log,canny,prewitt,sobel,roberts
kirsch
普通梯度法

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

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

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容