一、作業要求
撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎(如彩色圖像針可先將圖片 由 RGB 轉換至 HIS 或 YUV, YCbCr 等色彩空間,只需對亮度 Channel I 或 Y 處理,再 轉回 RGB 即可),設計一個類似素描線條自畫像程式。(如果可以分析邊緣偵測所得到 的點,結合成線條方式呈現更佳!)二. 使用環境
Operation system: windows10Virtual environment: Anaconda 4.6.8
Programing language: Python3.6.8
Library version: Opencv 3.4.1
三. 實作方法
將載入圖片做灰階
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
用Sobel邊緣檢測,分成水平和垂直方向的微分。
x = cv2.Sobel(gray, cv2.CV_16S, 1, 0)
y = cv2.Sobel(gray, cv2.CV_16S, 0, 1)
進行Sobel運算時,要是輸出圖和輸入圖深度相同,很有可能會發生saturate,以8位元強度0到255的影像來說,Sobel運算結果可能大於255或小於0,進而得到不合理的結果,所以假使輸入圖的深度為CV_8U 8bits無號,通常輸出圖深度使用CV_16S 16bits 有號數,固透過下列func將其轉回CV_8U並組合。
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
最終將其反白得最終輸出
result = 255 - sobel
cv2.imshow("Result", result)
cv2.imwrite('Result.jpg', result, [cv2.IMWRITE_JPEG_QUALITY, 90])
四. 實作結果
source |
gray |
sobel |
source |
gray |
sobel |
沒有留言:
張貼留言