2019年4月2日 星期二

s1051447的作業2

1072 CS362 影像處理概論 作業 2
1051447 梁雅錡
作業題目:
撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎,設計一個類似素描線條自畫像程式。


撰寫過程
(1)   作業系統環境:Windows
(2)   程式語言:Python
(3)   程式開發軟體:Pycharm
(4)   開發環境:
開發環境名稱
使用情形
Python 3.6
採用Python 3.6編寫程式。
OpenCV.4.0.0.21 
利用OpenCV 4.0.0.21的套件讀取讀片、畫出不同亮度的圖片、以及存取圖片檔。
Numpy 1.15.4
使用Numpy 1.15.4調整圖片的各個像素變動。

(5)   程式內容:

因為我將使用OpenCV的Sobel Operators技術來實作邊緣偵測,這個技術需使用灰階的影像,基於每個像素灰度的不同,利用不同物體在其邊界處會有明顯的邊緣特徵來分辨。

因此首先需要使用cvtColor套件,將讀取的全彩圖轉換成灰階圖;第二,為了避免偵測到過多雜訊,所以我先將影像模糊化後再處理,利用高斯模糊方法(GaussianBlur);第三,就是使用剛才提到的Sobel套件偵測邊緣,並且畫出邊緣的線條。

其中,Sobel套件可以單除針對X軸、Y軸、X與Y軸抓取其邊緣,輸出的資料型態設定為浮點資料格式CV_64F,最後指定要針對X軸、Y軸、X與Y軸運算。


(6)  程式成果:
以下將展示三種不同圖片的成果,分別為虛擬動畫人物圖、真實女生圖、真實男生圖
    I. 虛擬動畫人物圖




II. 真實女生圖



III. 真實男生圖



    接下來,我將以上使用Sobel Operators技術進行邊緣偵測的成果,與以下使用Canny技術進行邊緣偵測的成果作比較:
    
    在Canny套件的參數中,有兩個參數可以調整,分別是threshold1和threshold2,意思是,圖形的任意點像素,若其值大於threshold2,則認定它屬於邊緣像素,若小於threshold1則不為邊緣像素,介於兩者之間則由程式依其像素強度值運算後決定。


I. 虛擬動畫人物圖
(右下圖中,調整Canny套件中的threshold1為10、threshold2為75)




II. 真實女生圖
(右下圖中,調整Canny套件中的threshold1為15、threshold2為75)



III. 真實男生圖
(右下圖中,調整Canny套件中的threshold1為20、threshold2為45)

    依照我的程式成果比較下來,我們可以得到結論是:

    Sobel:
  • 用於提取邊緣,可以利用快速卷積函數,簡單有效,因此應用廣泛。
  • 缺點是Sobel算子並沒有將圖像的主題與背景嚴格地區分開來,所以提取的圖像輪廓有時並不能令人滿意,但是算法具體實現很簡單。

    Canny:
  • 在線條上的呈現較Sobel要好一些,Canny算子是一個具有濾波,增強,檢測的多階段的優化算子。
  • 它實現起來較為麻煩,需視圖片雜訊多寡,調整threshold。

    

(7)  儲存結果:
      包括原圖在內,我的程式在每一次將圖片做轉換時(灰階、模糊化、邊緣線條),都會儲存一次當前圖片,如下圖所示,使用的是openCV的imwrite套件。






沒有留言:

張貼留言