在《Java數字圖像處理-程式設計技巧與應用實踐》一書的第九章講到了Canny邊緣檢測的代碼實作,在求取梯度與角度處理,非最大信号壓制之後,有一步是通過兩個門檻值(高低門檻值)實作邊緣斷線的連接配接,得到完整的邊緣,之前給出的代碼是固定門檻值,這個有兩個改動:
改動一:
改為自動門檻值了,高的門檻值是梯度的平均值means的兩倍,低門檻值是平均值的二分之一。
改動二:
高低值連接配接的時候遞歸程式改為非遞歸程式,通過圖的深度優先隊列實作邊緣像素連接配接。
這兩個改動的原因是有讀者向我回報說提供的代碼在處理大圖檔的時候遞歸的代碼導緻棧溢出錯誤,如今改為非遞歸之後,我測試過1600x1200的圖檔進行邊緣提取,完全沒有問題。
先看效果:原圖:

處理之後:
源代碼改動說明:
不再使用follow(col, row, offset, lowThreshold);方法
直接改為非遞歸的圖的深度優先隊列進行處理,對每個像素點建構PixelNode資料結構
自動門檻值與非遞歸的代碼如下:
不再贅述!