邊緣偵測與製作線條自畫像撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎(如彩色圖像針可先將圖片 由 RGB 轉換至 HIS 或 YUV, YCbCr 等色彩空間,只需對亮度 Channel I 或 Y 處理,再 轉回 RGB 即可),設計一個類似素描線條自畫像程式。
二、原理
去雜訊:利用高斯函數得到高斯濾波的各個參數
紀錄梯像素梯度方向與強度:以Sobel運算子計算水平和垂直梯度(Gx,Gy),兩者平方後相加得到梯度強度(G)
非最大抑制:採用梯度找邊緣,邊緣會比較模糊,這方法讓邊緣定位較精確,比較每個像素,當這個像素的梯度強度最大就保留此像素的值,否則設成0
判斷邊界:依據輸入的上下兩個閾值判斷此像素是否為邊緣,下列三種判斷依據,
- 此像素梯度強度大於上閾值,此像素為邊緣
- 此像素梯度強度小於下閾值,此像素不為邊緣
- 此像素梯度強度介於上下閾值,若此像素周圍,有像素的梯度強度大於上閾值,則此像素為邊緣,否則不為邊緣
三、使用環境/語言
- Windows 10
- Spyder
- Python 3.7.1
- Opencv 3.4.1
四、特殊程式片段註解
- cvtColor //以BGR顏色空間轉換到灰度空間
- GaussianBlur //用來去除雜訊
- Canny //抗雜訊及精確定位有較好的效果
- hstack //將原圖與調整過的圖水平方向堆疊起來
- createTrackbar //建立滑動條調整閾值大小
- imwrite //將照片寫入路徑上存放
五、環境設置
- 將Anaconda的路徑加入的path
- 於Anaconda cloud server中搜尋package(cmd輸入:anaconda search opencv)
- 挑選一個符合系統的package(cmd輸入:conda install -c https://conda.anaconda.org/package名稱)
- 下載完畢後,開啟Spyder執行程式
六、執行結果
- 閾值=0
- 閾值=11
- 閾值=38
- 閾值=70
- 閾值=100
- 儲存圖片(dog copy)
七、影片連結
- https://youtu.be/qLNZ2wYlpO0
八、參考資料
- http://monkeycoding.com/?tag=canny
沒有留言:
張貼留言