数字图像处理:(3)一阶微分算子在图像处理中的应用
目錄
1、數學基礎
2、圖像微分知識
3、濾波器
4、微分算子
4.1、一階微分算子
4.1.1、Sobel算子
4.1.2、scharr算子
4.1.3、?Roberts交叉梯度算子
4.1.4、Prewitt算子
4.1.5、 Isotropic Sobel算子
1、數學基礎
函數一階導數對應的微分稱為一階微分;
一階微分的微分稱為二階微分;
二階微分及以上的微分稱為高階微分;
首先,圖像是離散的數據,若求其導數就要用差分的方法,常用的差分方法是前向差分(forward differencing)與中心差分(central differencing)。一階導本質上求的是斜率,二階導求的是拐點。
2、圖像微分知識
一階導數:
圖像梯度:
??二階導數:
3、濾波器
平滑濾波器(低通濾波器),是用來平滑圖像和抑制噪聲的;而銳化空間濾波器恰恰相反,主要用來增強圖像的突變信息,圖像的細節和邊緣信息。平滑濾波器主要是使用鄰域的均值(或者中值)來代替模板中心的像素,消弱和鄰域間的差別,以達到平滑圖像和抑制噪聲的目的;相反,銳化濾波器則使用鄰域的微分作為算子,增大鄰域間像素的差值,使圖像的突變部分變的更加明顯。
4、微分算子
不同圖像灰度不同,邊界處一般會有明顯的邊緣,利用此特征可以分割圖像。需要說明的是:邊緣和物體間的邊界并不等同,邊緣指的是圖像中像素的值有突變的地方,而物體間的邊界指的是現實場景中的存在于物體之間的邊界。有可能有邊緣的地方并非邊界,也有可能邊界的地方并無邊緣,因為現實世界中的物體是三維的,而圖像只具有二維信息,從三維到二維的投影成像不可避免的會丟失一部分信息;另外,成像過程中的光照和噪聲也是不可避免的重要因素。??
4.1、一階微分算子
對于一階微分的任何定義都必須保證以下幾點:
- (1)在恒定灰度區域的微分值為0;
- (2)在灰度臺階或斜坡的起點處微分值不為0;
- (3)沿著斜坡的微分值非0;
4.1.1、Sobel算子
?其主要用于邊緣檢測,在技術上它是以離散型的差分算子,用來運算圖像亮度函數的梯度的近似值,?Sobel算子是典型的基于一階導數的邊緣檢測算子,由于該算子中引入了類似局部平均的運算,因此對噪聲具有平滑作用,能很好的消除噪聲的影響。Sobel算子對于象素的位置的影響做了加權,與Prewitt算子、Roberts算子相比因此效果更好。
Sobel算子是計算不同方向的梯度,比如說計算x方向的梯度,我們使用下方的卷積核(用卷積核與原始圖像相乘操作):(中間的這一行離P5特別近所以給他加了一個系數2)
水平方向的梯度:就是右邊一列的值減去左邊一列的值,再乘以適當的系數,就可以計算出p5這一點他到底有沒有差值,差值越大,那就意味著p5這一點是邊界。
上述計算的是P5這一個點X方向或者水平方向這一個點的梯度(簡單說就是從右邊向左邊有沒有邊界)。(挨個點都用卷積核去計算)?
?垂直方向的梯度:下邊減去上邊的值。(中間的這一列離P5特別近所以給他加了一個系數2)
如果計算的梯度值很大,那么它很可能就是一個邊界。?
?整個圖像兩個方向的梯度就是:
故,P5點的Sobel的邊界值或者梯度值
?
?每一個點都是這樣去算的,然后就把整個圖像的梯度值計算出來了。(記得邊界補充的方法)
?Sobel算子的函數:
?dst:是梯度圖像,就是計算結果。
ddepth:?是處理結果圖像深度。通常情況下可以將該參數的值設為1,讓處理結果與原始圖像保持一致。
dx:表示計算x軸方向的梯度(或者說X軸上的邊界)。(計算X方向的梯度,我們就讓dx=1,dy=0)
dy:表示我計算y軸上的邊界。(計算Y軸方向的梯度,我們就讓dx=0,dy=1)?
ksize:這個參數一般不用(默認為3,表示3行3列);如果使用的話設置為奇數。
? ? ? ? ? ? ? ? ??
左圖為:水平方向(梯度);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?右圖為:垂直方向(梯度) ;
(1)第一種處理模式:直接處理左邊界處理為0 (計算出來為負數直接處理為0),那就是沒有這個邊界了,0梯度沒有梯度。
(2)第二種處理模式:取絕對值(計算為負數,我們取絕對值)這樣邊界就出來了。一般是采用這種處理方式,計算結果為負值的話,取他的絕對值。
PS:OpenCV官網:計算水平方向的梯度值,給出來的是垂直方向的,(這是因為我們考慮的是某一點,很多個水平方向的梯度值組成一條線,剛好是一個垂直線。)
所以為了既能處理正數又能處理負數,在ddepth這個參數的時候,我們沒有使用默認的-1,而是使用的是cv2.CV_64F,就表明我們要使用他那個負數的值:
?所以進一步的如果我們出現了負數,在256色位圖中要怎么辦呢?必須通過下邊的函數,表示把我們的負數的值取絕對值:
alpha是他的系數;beta是他的修正值。
?雖然上面的公式中用到了系數和修正值來計算即下圖左邊的方法;但是一般在計算時我們沒有這么的復雜而是使用下圖右邊的方式,直接輸入的是圖像。
?
?------------------上面是對于ddepth參數的解釋(不能直接設置為-1,因為邊界會丟失)-----------------
?在計算梯度的時候:
計算方式分為兩種:第一種一起計算;第二種分開計算再求和。下圖是計算Sobel的兩種方式:
?
但是第一種方式不太嚴謹,更多的時候使用的是第二種方式。 第二種方式為了確保在相加時比如我們我們兩個方向上計算結果都很大,超過了255,他就會溢出,所以把每一個都乘以一個系數,這個系數一般是0.5,最后得到一個比較不錯的圖像。
針對于上述的第二種必須要我們自己去加計算,CV里邊提供了一個函數如下:
上述函數的關系就是:
原圖像1乘上他的系數+原圖像2乘上他的系數,最后再加上修正值,最后得到一個目標圖像。
?下面是Sobel算子CV代碼的使用:
下面參數設置為-1只取到了右側邊界,因為左側邊界為負數,將其強制置為0。
?下面這個雖然改變了參數不是-1了,你把它的范圍擴大了,但是在運算的時候還是它的負數仍然設置為0了,所以還是只有右側邊界:
?下邊如果讓左邊界出現,必須調用函數,添加一行代碼就會出現左邊界:
接下來再求Y方向的梯度:
?
PS:減法的順序和我們檢測出來的邊緣信息是正交的。
把X軸和Y軸的梯度一塊計算出來:
?
下面再進行調整把dx和dy都設置為1:
?直接計算兩者的方式并沒有把邊界找出來或者即使找出來效果也不好,所以為了更好地找出邊界,我們一般是使用分開計算,然后求和的方式來計算。
4.1.2、scharr算子
??Scharr作為一階微分算子被提出的原因,因為我們在使用3x3的Sobel算子的時候,可能會出現不太精準的情況,就是計算出來的梯度可能不太精確,導致邊緣不是很精準,Scharr算子效果更好,他的卷積核如下:
?計算方法和Sobel算子一樣,在水平方向仍然是左側的像素減去右側的像素,在垂直方向是下邊的像素值減去上邊的像素值,只是系數不一樣。離中心點稍微遠一點的系數是3,近一點的系數值是10。?Scharr和Sobel從運算量上來說兩者的運算量是一樣的,只是?Scharr的準確率更高,他可以說是我們對Sobel算子的一種改進,所以一般計算梯度的時候經常使用的是?Scharr算子。
Scharr算子在OpenCV中的使用:
?
?在參數設置上和Sobel一樣,一般處理深度不使用-1。
?
?
Scharr算子計算水平方向的梯度:
?
?計算垂直方向的梯度:
計算兩個方向上的提頓:
?
Sobel算子與Scharr 比較:
(1)大小一樣,意味著計算起來計算量是一樣的。
(2)計算的準確度不同,Scharr算子更高(更夠計算出相鄰像素更小的細小差異)。(精確度體現在系數差別上)
4.1.3、?Roberts交叉梯度算子
4.1.4、Prewitt算子
4.1.5、 Isotropic Sobel算子
上述幾個暫時未使用到。
總結
以上是生活随笔為你收集整理的数字图像处理:(3)一阶微分算子在图像处理中的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理:(1)图像梯度以及算子应用
- 下一篇: 数字图像处理:(4)二阶微分在数字图像处