2016-12-14 43 views
0

當將Sobel算子應用於X和Y方向的圖像並根據得到的X/Y向量計算角度(atan2)時,我似乎以45度步進得到梯度方向。索貝爾是否只能以45度的步長產生8個方向,或者我應該得到精確的角度還是會出現舍入誤差?索貝爾梯度角分辨率

我用索貝爾對合爲Gx和使用分級Sobel算子在這裏https://en.wikipedia.org/wiki/Sobel_operator

+0

索貝爾操作符將以1個角度獲得梯度方向,而不是幾個。你能展示一個MCVE嗎? –

+1

對不起,沒有足夠的描述。我正在計算X和Y的索貝爾。更新的問題。 –

+0

您仍然不會顯示任何可以重現您的聲明的代碼。索貝爾,如果計算浮動的圖像,不應該給你這樣的45度離散化。我猜你有整數舍入錯誤,但很難說沒有看到任何代碼。 –

回答

0

提到的是Gy。讓我們試着去了解你在做什麼,在這裏:

Sobel算子檢測垂直線條看起來像:

[-1 0 1 
-2 0 2 
-1 0 1] 

如果應用此像素(把這個像素的頂部,並使用相鄰像素中的值,然後將所有內容相加),如果右側的像素與左側的像素值不同,則只有非零值。如果是這種情況,則測量有一個垂直邊緣。

之後,45度Sobel算子:

[-2 -1 0 
-1 0 1 
0 1 2] 

如果你瞭解垂直一個是如何工作的,這應該是很容易理解。當矩陣的對角線具有不同的值時,最大值將發生,因此45度邊緣。

繼續之前,讓我們注意的事情,通過@ImanolLuengo在評論中提到:45度Sobel算實際上將看到一個30度的斜坡,它只是給它一個更小的值。它會減少它。如果你願意,你可以自己測試一下。

現在,使用3x3矩陣,您可以看到它很難獲得30度的邊緣,基本上是因爲我們使用的內核是謹慎小巧的(3x3)並不允許我們創建一個可以增強其他角度的kenrel。

但是,使用與Sobel算子相同的邏輯,我們可以考慮可以增強任意角度的更大尺寸的內核。

例如下面的內核將提高主要是30度:

[1 1 1 1 0 
1 1 0 0 0 
0 0 0 -1 -1 
0 -1 -1 -1 -1] 

這是一個「由kenrel的手近似值,因爲當你在索貝爾指出,一些核心構成要素有比別人更大的號碼。對於這個數字的規則是:在你想要檢測的邊緣方向上有更高的值,而實際上通過內核中心的值有更高的值。

這不是一個Sobel算子,但你可以只是編寫任何可以完成所需工作的內核。

+0

我認爲op是爲了計算'atan2(Gy,Gx)',它是'Gx'和'Gy'sobel水平和垂直濾波器。 –

+0

@ImanolLuengo thatns不是他問的! –

+0

這是我從*計算出的X/Y向量*的角度來理解的,至少哈哈。 –