2017-05-20 107 views
1

什麼是圖像梯度幅度的單位和極限?例如,我知道如何獲得圖像的漸變大小(見下文)。結果Mat將包含我的源圖像中每個邊緣的邊緣強度(大小)。什麼是單位和梯度幅度的限制?

但是「邊緣強度/幅度」的單位是什麼?梯度方向是以度/弧度爲單位,單位是多少? OpenCV中幅度的限制是什麼?它是0到1,即一個邊緣的強度/大小在0到1之間,其中1是完全垂直的?

所以,如果我要繪製一個統計圖的大小, x軸表示邊緣強度/陡度,y naxis表示具有該強度/陡度的像素數量?我對麼?

Mat sX, sY, mag; 
Sobel(src, sX, CV_32F, 1, 0, 1); 
Sobel(src, sY, CV_32F, 0, 1, 1); 

magnitude(sX, sY, mag); 

// So mag now contains the image gradient magnitude 
// of the all the edges I pulled out by sobel. 
// What are the units and limits of 'edge strength'/magnitude? 
// For example are the limits 0 to 1? 

回答

5

單位

你正在做一個函數的一些近似的衍生物。如果功能是,例如,f(x),那麼請記住您正在查看更改f更改x。假設函數是基於時間r(t)的位置,則導數的單位是時間(時間)差異上的位置(距離)的差異。那麼圖像的單位是什麼?那麼,它們是某些位置的光度值。光度值的變化只是光度值,位置的變化是距離。所以導數的單位是光度/距離。

梯度幅度

因爲我們有一個形象的工作中,最小距離爲一個像素和最大的變化可能是從白到黑(反之亦然),因此那些將與最大的梯度相對應。但Sobel可以使用任意矩陣,其最小值和最大值可能遠遠超出0到1或0到255.

請注意,您可以得到斜率的負值:以像素爲單位的距離總是正值,但從白色變爲黑色,黑色變爲白色的跡象相反。在Sobel計算出這些衍生物之後,您將分別計算大小角度分開。你可以計算出基於各方向梯度的強度加權xy方向的角度,它需要的跡象。如果你想要的大小正值0和360

之間返回任何角度所有邊緣,和0用於非邊緣的,既可以採取L1範數,這是abs(x) + abs(y),或採取歐幾里得L2範數the magnitude functionsqrt(G(x)^2 + G(y)^2),想你將計算三角形的斜邊。直接添加意味着某些漸變是積極的,有些則是消極的,留下的灰色圖像顯示黑色和白色邊緣。從Sobel算

Sobel算子簡單計算像素的鄰域衍生

價值,不只是比較兩個,但6個像素,並且它們的權重,把它們加起來---所以可以比圖像中的值高一點。而且,浮點圖像在0或1時不會被截斷,所以您可以發送更大值的圖像並獲得更大的值。在數據類型可以容納的最大值之外,操作符沒有虛擬最大值。 Sobel算子在梯度計算之前也會進行一些平滑處理,以去除小邊緣,但平滑算子不會縮放這些值。

在OpenCV docs for Sobel顯示操作者乘以你的形象價值。具體地,對於x方向,每3×3像素鄰域得到的elementwise通過

-1 0 1 
-2 0 2 
-1 0 1 

並求和相乘。如果你的圖像類型的最大可能值爲M和最小值是m然後在漸變中的最大正值是

(1+2+1)*M - (1+2+1)*m = 4*M - 4*m 

,同樣最大負值

-(1+2+1)*M + (1+2+1)*m = -4*M + 4*m 

這是每個方向上的漸變也一樣。所以,從Sobel您在每個方向梯度的範圍將是[-4M+4m, 4M-4m]

規範化操作

您將添加兩個這樣幅度的一起以某種方式,或者與L1-L2或範數。假如你堅持使用L2範數,最大的合力大小的將僅僅是,在L2範數的定義如下,

sqrt((4M-4m)^2 + (4M-4m)^2) = sqrt(2(16M^2-16m^2)) = 4*sqrt(2(M^2-m^2)), 

,最低將同樣是

4*sqrt(2(m^2-M^2)). 

因此,你終於可以規範化梯度,具體爲0到1之間您的圖像類型通過添加最小值,然後除以最大值和最小值之間的差值。這將允許您比較多個圖像邊緣的強度。

或者你可以只使用normalize功能,但最終值將取決於您的圖像,所以您不能跨圖像進行比較相等的值。

+0

關於限制:你處理這個幅度的sqrt(GX^2 + GY^2)? – Micka

+0

@Micka我剛剛糾正了一分鐘前的事實。根據[本教程](http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html)它有時計算歐幾里得範數,有時計算的絕對值之和。我不知道什麼時候選擇哪個。我會研究它,因爲我很好奇。 –

+0

本教程僅計算近似值,函數cv :: magnitude應始終計算歐氏範數。 – Micka