Canny算子解析
在岡薩雷斯老師的數字圖像處理中,有這麼一段話:
雖然算法複雜,但本節討論的(Canny[1968])是迄今爲止討論的邊緣檢測器中最爲優秀的。Canny方法基於三個基本目標:
1。低錯誤率,所有的邊緣都應該被找到,並且沒有僞響應。也就是檢測的邊緣必須儘可能是真實的邊緣。
2.邊緣點應該被很好的定位。已定位的邊緣必須儘可能接近真實邊緣。也就是由檢測器標記爲邊緣的點和真實邊緣的中心之間的距離應該最小。
3.單一的邊緣點響應。對於真實的邊緣點,檢測器返回一個點,也就是真實邊緣周圍的局部大數應該是最小的。這意味着僅存在一個單一邊緣點的位置,檢測器不應該指出多個邊緣像素。
但是需要注意的是,由於受到實際情況的影響,以及Canny邊緣一些實際的情況的影響,實際上,我們真正能夠提取Canny邊緣也不一定是準確的。
步驟
1.令爲輸入圖像,爲高斯函數
用G和f的卷積形成一幅平滑後的圖像:
實際在MATLAB中使用imgaussfilt(f,sigma)即可,但是由於做的ui最好讓用戶有點交互性,所以我會設計讓用戶自己輸入sigma的值。
2.計算梯度幅值和方向:
和
實際上爲了效率的提升我們計算的時候我們會採用sobel或者其他模板,我在程序設計時就是用的sobel模板進行卷積,即fspecial函數,以及它的轉置。其中, 。然後根據算出的相角進行賦值,可以分爲水平邊緣、垂直邊緣、45,-45的邊緣。角度計算根據第三步中的圖進行計算,下圖會很明確,根據範圍進行賦值。
3.NMS極大值抑制
實際上在本篇文章中,我採用的就是最原始的Canny。在上一步中,你完成了梯度賦值和角度圖像的計算,根據角度去尋訪,
比如如這幅圖像裏所說的,如果你是垂直的我就去尋訪它上方和下方的位置,如果你在循環中所在像元<或者中的任何一個,那麼我就認定它是一個僞邊緣。同理,水平邊緣尋訪左右兩個像元,斜和同樣去尋訪。
4.閾值處理和連接
實際上,我採用的閾值處理方法是一個不是很嚴謹的方法我採用的是最大值的0.08倍和0.24倍作爲低閾值和高閾值,應該算一種經驗模型吧。檢測完之後再進行形態學連接。
https://www.bilibili.com/video/BV18C4y1a7RY/一個Canny邊緣提取的ui
最後放上我做完的ui的演示視頻。我感覺我還是可能講不清楚,畢竟理解的還不是特別完全。
我的UI主要是考慮交互性以及錯誤的提示。