2019年3月28日 星期四

s1053315 作業二

一、作業要求:

邊緣偵測與製作線條自畫像撰寫一個程式,讀取一張 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形式。否則將無法顯

示圖像,而只是一副灰色的窗口。

3.用cv2.addWeighted(...)函數將x方向和y方向組合起來:

dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])

其中alpha是第一幅圖片中元素的權重,beta是第二個的權重,gamma是加到最後結果上的

一個值。

四、環境設置介紹:

       首先下載 Anaconda 後將其路徑加入到path,以免python無法正確運行。
Anaconda cloud server中搜尋要安裝的package
在cmd中輸入: anaconda search opencv



      挑選一個覺得順眼以及符合系統需求的package 輸入:conda install -c https://conda.anaconda.org/package名稱 下載完畢開啟Spyder即可

五、執行結果:

由左至右依序為:原圖、x方向處理結果、y方向處理結果、x+y方向處理結果




六、參考資料:

沒有留言:

張貼留言