s1093345 作業2
作業說明
- 主題:線條自畫像(二值化與邊緣偵測 Image Thresholding and Edge Detection)
- 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)
(a) 利用Sobel Operators 偵測並輸出邊緣成分圖。
(b) 設計一個類似素描線條的自畫像圖案。
圖一、Input Image
開發環境
- macOS 13.2.1
- Visual Studio Code 1.56.2
- Python 3.8.3
- OpenCV 4.6.0
實作過程
- 邊緣成分圖
- 初始化設定
- 透過 cv2.imread(‘path’) 讀取圖片位置,括號內放置圖片路‘path’。
- 使用 cv2.cvtColor() 、 cv2.COLOR_BGR2GRAY() 將原始圖片轉換為灰階圖片,如圖二。
圖二、灰階圖片
- 高斯模糊函數
- 使用cv2.GaussianBlur(img, (kernel_size, kernel_size), 0) 去噪、模糊化,img為輸入的原始圖片,kernel_size以 3 x 3 計算,,kernel_size越大會越模糊。標準差為0。如圖三。
圖三、高斯模糊去噪圖片
- 索伯算子(Sobel Operator)
- 使用cv2.Sobel(img, depth, dx, dy, kernel_size)分別計算x方向以及y方向的梯度。img為先前高斯模糊後的圖片,depth設值為cv2.CV_64,計算x方向梯度時dx為1、dy為0,計算y方向梯度則反之,kernel_size設為3。
- 使用 cv2.ConvertScaleAbs() 分別將x方向以及y方向的梯度img取絕對值,並轉回 unit8 的型別。如圖四、圖五。
- 透過 cv2.addWeighted(img1, alpha, img2, beta, gamma) 分別將 x 方向以及 y 方向的梯度圖片img1, img2以自行設置的權重alpha, beta相加,即可獲得邊緣成分圖。
- 素描線條的自畫像
- 呈上述步驟
- 二值化(Threshold)
- 透過 cv2.threshold(img, 67, 255, cv2.THRESH_BINARY) 將高斯模糊後的圖片二值化,將像素值小於67的像素設置為0,否則設置為255。如圖六。
圖六、二值化圖片
- 相反色操作
- 使用 cv2.bitwise_not(img) 將先前的 Sobel 後的圖片及二值化的圖片做not,即黑色轉白色,白色轉黑色。
- 透過cv2.addWeighted(img1, alpha, img2, beta, gamma) 分別將上述cv2.bitwise_not() 過後的img1, img2以自行設置的權重alpha, beta相加,即可獲得素描圖。
留言
張貼留言