邊緣偵測與製作線條自畫像撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎(如彩色圖像針可先將圖片 由 RGB 轉換至 HIS 或 YUV, YCbCr 等色彩空間,只需對亮度 Channel I 或 Y 處理,再 轉回 RGB 即可),設計一個類似素描線條自畫像程式。
二、使用環境/語言:
- Windows 10
- Spyder ( Python3.5 )
- Python
- Opencv 3.4.1
1.用Sobel Operators偵測圖像邊緣:
dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
前四個是必須的參數:
第一個參數是需要處理的圖像;
第二個參數是圖像的深度,-1表示採用的是與原圖像相同的深度。目標圖像的深度必須大於
等於原圖像的深度;
dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般為0、1、2。
其後是可選的參數:ksize是Sobel算子的大小,必須為1、3、5、7。
scale是縮放導數的比例常數,默認情況下沒有伸縮係數;
delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT。
2.使用cv2.CV_16S換成16位有符號的數據類型:
在Sobel函數的第二個參數這裡使用了cv2.CV_16S。因為OpenCV文檔中對Sobel算子的介紹
中有這麼一句:“in the case of 8-bit input images it will result in truncated
derivatives”。即Sobel函數求完導數後會有負值,還有會大於255的值。而原圖像是
uint8,即8位無符號數,所以Sobel建立的圖像位數不夠,會有截斷。因此要使用16位有符
號的數據類型,即cv2.CV_16S。
在經過處理後,別忘了用convertScaleAbs()函數將其轉回原來的uint8形式。否則將無法顯
示圖像,而只是一副灰色的窗口。
中有這麼一句:“in the case of 8-bit input images it will result in truncated
derivatives”。即Sobel函數求完導數後會有負值,還有會大於255的值。而原圖像是
uint8,即8位無符號數,所以Sobel建立的圖像位數不夠,會有截斷。因此要使用16位有符
號的數據類型,即cv2.CV_16S。
在經過處理後,別忘了用convertScaleAbs()函數將其轉回原來的uint8形式。否則將無法顯
示圖像,而只是一副灰色的窗口。
3.用cv2.addWeighted(...)函數將x方向和y方向組合起來:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
其中alpha是第一幅圖片中元素的權重,beta是第二個的權重,gamma是加到最後結果上的
一個值。
其中alpha是第一幅圖片中元素的權重,beta是第二個的權重,gamma是加到最後結果上的
一個值。
四、環境設置介紹:
首先下載 Anaconda 後將其路徑加入到path,以免python無法正確運行。
挑選一個覺得順眼以及符合系統需求的package 輸入:conda install -c https://conda.anaconda.org/package名稱 下載完畢開啟Spyder即可
沒有留言:
張貼留言