天天看點

圖像處理(四) Sobel邊緣檢測與canny邊緣檢測對比Sobel邊緣檢測與canny邊緣檢測對比梯度幅值和梯度方向實驗對比matlab 代碼

Sobel邊緣檢測與canny邊緣檢測對比

  • Sobel邊緣檢測與canny邊緣檢測對比
  • 梯度幅值和梯度方向
  • 實驗對比
  • matlab 代碼

Sobel邊緣檢測與canny邊緣檢測對比

邊緣檢測指的是得到灰階發生劇烈變化的位置,邊緣檢測的目的是制作一個線圖,提供對圖像資料的合适概述。sobel邊緣檢測算法和canny邊緣檢測算法是較為常見的兩種邊緣檢測算法。sobel邊緣檢測算法分為兩個步驟:(1)首先用到sobel算子,提取灰階內插補點資訊,也就是圖像梯度值,(2)用單閥值進一步提取邊界資訊。canny邊緣檢測算法包含四個步驟:(1)高斯濾波,(2)使用sobel算子分别計算x,y方向梯度分量及梯度方向,(3)對梯度進行非極大值抑制, (4)使用雙門檻值對邊緣進一步檢測和增強。

可以看出,這兩種算法都是計算梯度資訊和方向,最後根據這個梯度資訊進行檢測邊界,總體流程上是一緻的。不同點就是檢測這一塊,cannny算法給出了非極大值抑制和雙門檻值法可以排除不是邊界點的幹擾,更好的能夠提取出邊界。

梯度幅值和梯度方向

圖像處理(四) Sobel邊緣檢測與canny邊緣檢測對比Sobel邊緣檢測與canny邊緣檢測對比梯度幅值和梯度方向實驗對比matlab 代碼

梯度幅值

圖像處理(四) Sobel邊緣檢測與canny邊緣檢測對比Sobel邊緣檢測與canny邊緣檢測對比梯度幅值和梯度方向實驗對比matlab 代碼

梯度方向

圖像處理(四) Sobel邊緣檢測與canny邊緣檢測對比Sobel邊緣檢測與canny邊緣檢測對比梯度幅值和梯度方向實驗對比matlab 代碼

實驗對比

Sobel算法結果

圖像處理(四) Sobel邊緣檢測與canny邊緣檢測對比Sobel邊緣檢測與canny邊緣檢測對比梯度幅值和梯度方向實驗對比matlab 代碼

Canny算法結果

圖像處理(四) Sobel邊緣檢測與canny邊緣檢測對比Sobel邊緣檢測與canny邊緣檢測對比梯度幅值和梯度方向實驗對比matlab 代碼

Sobel梯度幅值圖像可以看出在圖像邊緣部分梯度幅值越大,另外對比sobel算法邊緣檢測結果與canny邊緣檢測結果可以看出,canny的檢測效果更好,主要原因是canny算法在邊緣檢測時采用了非極大值抑制以及雙門檻值方法,是以排除了非邊緣點的幹擾,檢測效果更好。

matlab 代碼

clc
clear
close all
image=imread('lena.jpg');
image_gray=rgb2gray(image);
subplot(2,2,1)
imshow(image_gray)
title('原圖像')
%% sobel梯度幅值圖像
Gx=conv2(image_gray,[-1 0 1;-2 0 2;-1 0 1],'same');
Gy=conv2(image_gray,[-1 -2 -1;0 0 0;1 2 1],'same');
sobel_amp=sqrt(Gx.^2+Gy.^2);
subplot(2,2,2)
imshow(sobel_amp/255)
title('sobel梯度幅值圖像')

%% sobel梯度方向圖像
sobel_phase=atan(Gy./Gx);
subplot(2,2,3)
imshow((sobel_phase+pi/2)/pi)
title('sobel梯度方向圖像')
%% 基于梯度的邊緣檢測結果
edge_sobel=zeros(size(image_gray));
for i=1:size(image_gray,1)
    for j=1:size(image_gray,2)
        if sobel_amp(i,j)>80
            edge_sobel(i,j)=1;
        end
    end
end
subplot(2,2,4)
imshow(edge_sobel)
title('基于梯度的邊緣檢測結果')
%% canny邊緣檢測
edg_canny=edge(image_gray,'canny');
figure
imshow(edg_canny)
title('canny邊緣檢測結果')