2019年4月2日 星期二

1043362的作業二



一、作業要求

撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎(如彩色圖像針可先將圖片 由 RGB 轉換至 HIS 或 YUV, YCbCr 等色彩空間,只需對亮度 Channel I 或 Y 處理,再 轉回 RGB 即可),設計一個類似素描線條自畫像程式。(如果可以分析邊緣偵測所得到 的點,結合成線條方式呈現更佳!)



二. 使用環境

Operation system: windows10
Virtual 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


沒有留言:

張貼留言