s1091541 作業2
主題: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection)
撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE) (a)利用 Sobel Operators 偵測並輸出邊緣成分圖 (b)設計一個類似素描線條的自畫像圖案。
開發環境:
- windows11
- Opencv 4.7.0
- Visual Studio 2022 C++
程式碼說明:
(a)利用 Sobel Operators 偵測並輸出邊緣成分圖 :
- 取得灰階模式圖像後,首先使用GaussianBlur()函數進行降噪,在這裡我使用的kernal大小為3*3。
- 套用Sobel函數,xdir與ydir是用於儲存Sobel濾波器應用後所產生的x與y方向的邊緣檢測結果的陣列,第四與第五個參數各代表x,y方向當x方向的參數為1則生成xdir反之亦如此。最後一個參數代表Sobel的kernal大小。
- 套用convertScaleAbs()函數,因為上一個步驟的結果有可能為負數,所以需要此函數除去符號以方便後續處理。
- 使用addWeighted()將xdir與ydir合併形成一張圖,再透過bitwise_not()將黑白反轉即可得到圖(一)。
(b)設計一個類似素描線條的自畫像圖案:
為了讓圖片更接近素描圖像,我把一些顏色較深的線條調淡。
- 使用threshold()將圖(一)中顏色較深的地方分隔出來如圖(二)。 圖(二) 圖(三)
- 接著對圖(二)使用dilate()將其膨脹成圖(三)。
- 最後將圖(一)與膨脹完的圖(三)使用addWeighted()合併成圖(四)。
成果:
(a) (b)
留言
張貼留言