當將Sobel算子應用於X和Y方向的圖像並根據得到的X/Y向量計算角度(atan2
)時,我似乎以45度步進得到梯度方向。索貝爾是否只能以45度的步長產生8個方向,或者我應該得到精確的角度還是會出現舍入誤差?索貝爾梯度角分辨率
我用索貝爾對合爲Gx
和使用分級Sobel算子在這裏https://en.wikipedia.org/wiki/Sobel_operator
當將Sobel算子應用於X和Y方向的圖像並根據得到的X/Y向量計算角度(atan2
)時,我似乎以45度步進得到梯度方向。索貝爾是否只能以45度的步長產生8個方向,或者我應該得到精確的角度還是會出現舍入誤差?索貝爾梯度角分辨率
我用索貝爾對合爲Gx
和使用分級Sobel算子在這裏https://en.wikipedia.org/wiki/Sobel_operator
提到的是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算子,但你可以只是編寫任何可以完成所需工作的內核。
我認爲op是爲了計算'atan2(Gy,Gx)',它是'Gx'和'Gy'sobel水平和垂直濾波器。 –
@ImanolLuengo thatns不是他問的! –
這是我從*計算出的X/Y向量*的角度來理解的,至少哈哈。 –
索貝爾操作符將以1個角度獲得梯度方向,而不是幾個。你能展示一個MCVE嗎? –
對不起,沒有足夠的描述。我正在計算X和Y的索貝爾。更新的問題。 –
您仍然不會顯示任何可以重現您的聲明的代碼。索貝爾,如果計算浮動的圖像,不應該給你這樣的45度離散化。我猜你有整數舍入錯誤,但很難說沒有看到任何代碼。 –