c#用canny算子做边缘提取_【图像处理】边缘检测
邊緣檢測
sobel
sobel是最常見也是最常用的邊緣檢測算子。一般來說,當我們想要獲取圖像的邊緣時,首先想到的就是像素值發生突變的位置,而如何用數學表達來刻畫"突變",一個很好的方式就是使用導數,而在圖像中,由于像素是離散的,我們一般使用差分來近似處理,使用某種算子來近似計算全圖每一點的梯度值,其中梯度明顯大于鄰近像素的點就被認為是邊緣(實際處理中,使用大于某一閾值作為評判標準)。
sobel算子就是實現上述算法的一種基本算子,其一般分為水平和垂直兩個方向的計算,兩個方向上的算子互為轉置。在兩個方向分別計算完成之后,取其絕對值的和或平方和的算術平方根(1,2范數),即得到最終的梯度結果。(一般來說在硬件上計算絕對值要比平方開方廉價很多,所以一般使用絕對值較多)
此外,當濾波器大小為3的時候,sobel算子的近似將會帶來明顯的準確度下降,這時可以使用相同計算量但更為精確的Scharr算子,其近似計算更加精確。
具體的效果對比圖如下:(左原圖,中sobel,右scharr)
圖中可以看到在scharr對于頭發,嘴唇,皮膚紋理等細節的梯度信息提取的更好。
laplace
sobel及scharr是基于一階導數,選取一階導數的較大部分(例如極大值),那么自然,二階導數也成為了一個可用的評判指標,即用二階導數等于0來作為判斷是否為邊緣。當然由于導數等于0只是一個取極值的必要條件,所以不僅僅是邊緣的二階導數才為0,某些無意義(例如圖像的平坦區域,一階導數,二階導數都是0)的點也會存在,在實際處理中一般是添加濾波器來處理(比如檢測像素左右兩個像素差的絕對值大于閾值)。
在實際圖像處理中,一般使用laplace算子的差分近似,故得到常用模板如下:
此外,sobel算子具有明確的方向性(垂直和水平),將圖像旋轉某一角度,其提取效果就會下降,但是laplace算子卻是具有旋轉不變性的,這一點可從其模板中心對稱性,或者從原始公式證明得到(令
,代入公式化簡即可得證)。還有,由于laplace算子使用了二階導數,所以其相比sobel這種一階方法對噪聲更敏感,其受噪聲的影響更明顯(想象一下一條平滑的函數圖像上出現了很多鋸齒段,這樣自然會錯誤地發現更多虛假的極值點)。
canny
canny算子是一種更系統性的邊緣檢測算子,其使用sobel算子作為檢測器的補一份,同時首先使用gauss濾波器減弱噪聲的影響,提取出邊緣之后再用NMS(非極大值抑制)和閾值篩選來減少虛假邊緣,這里我主要涉及其中的非極大值抑制部分。
在目標檢測任務中對檢測框NMS已經是一個家喻戶曉的基本操作,但其實這是圖像處理算法中的常用技巧。canny中的非極大值抑制,即要在sobel提取出的梯度圖中找到梯度的局部最大值,并將非極大值置為0,從而減少虛檢。而canny中的NMS是指是否為梯度方向上的極大值,不像角點檢測等場景下是其鄰域中的最大值。具體的算法步驟如下:
- 對sobel提取的垂直和水平方向的結果使用反正切的近似獲得梯度方向
- 根據梯度方向在濾波器范圍內找到兩個鄰近的亞像素點(sub-pixel)
- 使用雙線性插值獲得這兩個亞像素點的梯度估計值
- 將兩個估計值和當前點的梯度相比較,若不是極大值,則置為0,否則保持不變
噪聲影響下的邊緣檢測
高斯白噪聲:
高斯白噪聲(AWGN),簡單來說就均值為0,方差為
的服從高斯分布的噪聲,由于"白化"條件,所以噪聲的二階矩是不相關的。高斯-泊松噪聲
高斯-泊松噪聲,將噪聲的來源分為兩部分,一部分是光子到達sensor時,即拍照時產生的噪聲(shot noise),shot noise可近似看作一個Poisson隨機變量,其均值是真實的的光子強度。另一部分是從電路中讀取像素值時產生的噪聲(read noise),它可以近似看作一個均值為0,方差為定值的Gaussian隨機變量。
在具體實現時,一般使用如下的近似策略
- 將其近似看作一個信號相關(signal-dependent)的高斯分布,即滿足如下公式:
其中x是真實值,noise是噪聲,y是加了噪聲之后的值
椒鹽噪聲
椒鹽噪聲(Pepper and Salt Noise),即隨機出現的hot point和dead point,即某個點的像素值為最大值(hot point)或最小值(dead point),在實際圖像設備中一般是由于sensor和傳輸中的干擾和錯誤產生,使得像素值達到上限或下限。
實驗效果
添加噪聲的后圖片如下:(從上到下依次為:原圖,高斯,高斯-泊松,椒鹽)
三種算子在添加噪聲后的效果如下:(三種邊緣檢測從左往右依次是sobel,laplace,canny)
- 從圖中可以看到sobel和laplace對噪聲的敏感性,天空部分在高斯-泊松噪聲和椒鹽噪聲的情形下,會錯誤保留大量的噪聲,致使整個梯度圖天空部分非常雜亂,而canny由于NMS和閾值抑制就會相對干凈很多。sobel的魯棒性要強于laplace,可以看到草地上sobel還是可以發現部分主干紋理,而laplace已基本和噪聲混為一體。
- 對于孤立點,可以看到由于算子模板的不同,sobel傾向于將其提取為"口"字狀的小方塊,而laplace傾向于提取為中心放射狀的點。
- 同時,對于紋理復雜的圖像,可以發現噪聲對于邊緣提取算法的影響十分嚴重,對比草地細節可以發現提取到的紋理變化較多,只是由于紋理過于密集所以遠觀感覺差異不大。
(注:此處所有邊緣檢測算法都在檢測之前做了高斯濾波,一定程度上減弱噪聲)
- 對于較為簡潔,圖像復雜紋理不多的圖像,canny對于噪聲的抵御能力明顯較強,可以看到三種噪聲帶來的影響都不是很大,而sobel和laplace在高斯-泊松噪聲和椒鹽噪聲下仍然會有嚴重的問題。
- 對于虛化部分,如該圖中的背景部分,雖然人眼仍然能看到一些物體邊緣,但是由于虛化之后像素變化幅度愈加小,致使大部分梯度值無法超過提取算法的閾值,故沒有呈現在結果圖中。
- 人像圖片的細節紋理,由于本身像素值變化幅度較小,加上磨皮等人像處理算法的作用,一般很難直接應用邊緣檢測算法提取出好的結果。
- 對于人像,canny提取出來的邊緣可視感比sobel和laplace要差,尤其是圖中的右眼部分,其更傾向于邊緣本身而不是保留原圖觀感。
- 第三行第2,3列這量張圖很有意思,可以看到在這種噪聲情形下人臉的輪廓,部分頭發和嘴唇細節也都有一定程度的響應。猜想適當的噪聲輔助可以提高某些情況下的邊緣檢測效果,人眼可視感明顯加強,這類似于人像圖像處理流程最后一定要適當放回部分噪聲,從而增強人像整體的可視感。(不過機器視覺可能并不認為這樣觀感好)
模糊影響下的邊緣檢測
線性運動模糊和非線性運動模糊
這里我使用傳統方法來生成模糊圖像,即使用運動模糊核和原圖做卷積運算,得到模糊后的結果,具體操作中使用了下列兩種模糊核,分別用來近似線性和非線性。
線性核:
非線性核:
高斯模糊
即在圖片進行邊緣檢測之前再使用一個更大的(kernel_size=7)的高斯核進一步磨平圖像。
實驗效果
從上到下依次是原圖,線性模糊,非線性模糊,高斯模糊
- 運動模糊對于邊緣檢測的影響非常嚴重,對于線性運動模糊,幾乎只有和運動方向相同的梯度可以檢測出,而對于非線性運動模糊,圖像模糊程度進一步加強,sobel由于算子的方向性,檢測效果下降很多,canny由于其復雜的抑制機制直接檢測不出任何邊緣,laplace雖然有響應,但是檢測到的也是雜亂無章的效果,類似圖片旋轉多次后的梯度疊加(天空和樹尤為明顯)。而換個角度考慮,canny可以作為運動模糊的檢測器。
- 高斯模糊則更接近一種磨平的效果,草地紋理減少了很多,碉堡上的圓孔也消失不見,但是部分過于雜亂的紋理也變的清晰一些。所以,適當的高斯模糊可以有效壓制噪聲,并簡化細節紋理,但是過強的則會丟失信息。
- 運動模糊本質上是一種積分操作,即可以簡單視作原圖和運動生成圖的疊加,簡化后,對運動模糊后的圖提取梯度可以看作原圖和生成圖的梯度疊加,這其中會有正負梯度的疊加導致信息減弱或消失,這從另一個方面解釋了為什么模糊后的圖像邊緣提取效果會嚴重下降。
- 高斯模糊下,canny左半部花的輪廓丟失,而sobel和laplace仍然可以看出輪廓。
- 孤立點,單個響應點,例如原圖中的白點,在高斯blur之后,canny由于其復雜的抑制處理,對其的提取能力會大大下降,其與周圍像素點的像素差被減弱,故無法通過閾值,而laplace仍可以保持一定的響應。故laplace對于孤立點的檢測效果更加robust。
邊緣檢測與銳化
暴力加邊緣
邊緣檢測算法的另一用途就是圖像銳化,人眼對于邊緣,細節紋理等高頻區域更加敏感,所以圖像處理中也因此要對其進行增強。一個最直觀的方法即將提取到的邊緣直接加到原圖上,從而達到增強效果。而由于laplace算子對于細節紋理信息的效果更好,所以銳化時一般使用laplace來提取高頻信息。
USM(unsharpened mask)
暴力加邊緣只是一種很初級的銳化算法。在各種圖像編輯中更加常用的是USM。USM的核心是去間接獲取高頻信息,具體的算法流程如下:
- 使用高斯濾波器提取低頻成分,并用原圖-低頻成分間接得到高頻成分diff
- 對原圖做對比度(constrast)處理得到增強圖
- 以diff為判斷依據,并結合事先確定好的閾值進行判斷,小于閾值的點保留原圖像素值,大于閾值的點通過公式$I = (1-r)O+rC$ 線性插值獲得,其中r是增益系數,O是原圖,C是增強圖。
實驗效果
從左到右依次是原圖,暴力加,USM
USM總的效果還是更好一些,不過USM的高斯濾波器參數設置需要調節,默認設置會產生明顯的artifact。
總結
以上是生活随笔為你收集整理的c#用canny算子做边缘提取_【图像处理】边缘检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族公布摄像头模组新专利,可手动加装闪光
- 下一篇: 宁德时代麒麟电池已量产,同体积比 468