2013-01-16 332 views
4

你好我的家庭作業的一部分。我需要使用Sobel邊緣檢測來計算並顯示圖像balls1.tif的邊緣幅度圖像和邊緣方向圖像。Sobel邊緣檢測 - MATLAB

不要使用MATLAB的邊緣功能。你可以使用conv2。 顯示強邊緣像素(閾值以上)的二值邊緣圖像(1邊緣像素,0無邊緣)。 確定消除球陰影的閾值。

,這裏是我的main.m

addpath(fullfile(pwd,'TOOLBOX')); 
addpath(fullfile(pwd,'images')); 

%Sobel Edge Detection 
Image = readImage('balls1.tif'); 
showImage(Image); 
message = sprintf('Sobel Edge Detection'); 
sobelEdgeDetection(Image); 
uiwait(msgbox(message,'Done', 'help')); 
close all 

這裏是我的SobeEdgeDetection.m

function [ output_args ] = SobelEdgeDetection(Image) 

maskX = [-1 0 1 ; -2 0 2; -1 0 1]; 
maskY = [-1 -2 -1 ; 0 0 0 ; 1 2 1] ; 

resX = conv2(Image, maskX); 
resY = conv2(Image, maskY); 

magnitude = sqrt(resX.^2 + resY.^2); 
direction = atan(resY/resX); 
thresh = magnitude < 101; 
magnitude(thresh) = 0; 
showImage(magnitude); 

end 

我的問題是:
1.我是用來做什麼方向?我如何顯示它?
2.有沒有更好的方式來獲得一個閾值,以消除球的陰影。我用試錯....

enter image description here

這些都是我的結果就顯示幅度:

enter image description here

+1

方向 - 是圖像上的梯度方向,它與物體邊緣正交。你的圖片不會讓你消除陰影:在這種情況下,你會失去一些上邊框。 –

回答

1

根據你的功課,你已經解決了這個問題,即第二部分,你消除了陰影。

對於第一個問題:該方向可以以許多不同的方式使用。這是最簡單的方法:用它製作漂亮的照片。考慮它的一個更有用的理由是當你進行非最大抑制時,但由於你沒有手動去做,所以沒有太多直接的用處。爲了可視化梯度方向的結果,只需要爲您考慮的每個方向建立顏色。爲了進一步簡化可視化還假設你減少方向的30度的增量高達180,從0開始這樣,如果你有35度的方向上,例如,你認爲這是30度(因爲它是最接近一個在你的縮小列表中)。接下來,我們看到一個圖像和其梯度方向的可視化,考慮Sobel和30度步進的離散化(黑色表示0度方向)。

enter image description hereenter image description here

自動確定好的閾值通常不是一件容易的事。例如,您可以從Otsu方法提供的那個開始,根據您嘗試解決的問題根據其他直方圖分析減少或增加其值。

+0

當itry使用imagsec或showImage我的圖像變成全黑色。我需要做一些縮放嗎? – Gilad

+0

我沒有做任何縮放,只是在答案中描述了什麼。任何從0度到29度都被分配爲強度0(黑色),從30到59分配到其他顏色,依此類推。然後你表明這一點。 – mmgp

1

這裏回答你的第一個問題:

在Sobel邊緣檢測算法中。獲得的方向基本上是梯度。

圖像處理中的梯度定義爲強度變化最大的方向。變化可以是強度增加或強度減弱。而且,這個變化是針對每個像素計算的,這意味着對於每個像素來說,最大強度變化被測量。 resX(在你的問題的例子中,SobelEdgeDetection.m)表示X方向的變化,而resY定義Y方向的變化。

見看到它實際上是剛剛火在Matlab的命令窗口中下面的命令: imshow(RESX);

也可以嘗試,imshow(RESY)