1072 CS362 影像處理概論 作業 2
1051447 梁雅錡
作業題目:撰寫一個程式,讀取一張 256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用 Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎,設計一個類似素描線條自畫像程式。
撰寫過程
(1) 作業系統環境:Windows
(2) 程式語言:Python
(3) 程式開發軟體:Pycharm
(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. 虛擬動畫人物圖
接下來,我將以上使用Sobel Operators技術進行邊緣偵測的成果,與以下使用Canny技術進行邊緣偵測的成果作比較:
在Canny套件的參數中,有兩個參數可以調整,分別是threshold1和threshold2,意思是,圖形的任意點像素,若其值大於threshold2,則認定它屬於邊緣像素,若小於threshold1則不為邊緣像素,介於兩者之間則由程式依其像素強度值運算後決定。
以下將展示三種不同圖片的成果,分別為虛擬動畫人物圖、真實女生圖、真實男生圖
I. 虛擬動畫人物圖
II. 真實女生圖
III. 真實男生圖
接下來,我將以上使用Sobel Operators技術進行邊緣偵測的成果,與以下使用Canny技術進行邊緣偵測的成果作比較:
在Canny套件的參數中,有兩個參數可以調整,分別是threshold1和threshold2,意思是,圖形的任意點像素,若其值大於threshold2,則認定它屬於邊緣像素,若小於threshold1則不為邊緣像素,介於兩者之間則由程式依其像素強度值運算後決定。
I. 虛擬動畫人物圖
(右下圖中,調整Canny套件中的threshold1為10、threshold2為75)
(右下圖中,調整Canny套件中的threshold1為10、threshold2為75)
II. 真實女生圖
(右下圖中,調整Canny套件中的threshold1為15、threshold2為75)
(右下圖中,調整Canny套件中的threshold1為15、threshold2為75)
III. 真實男生圖
(右下圖中,調整Canny套件中的threshold1為20、threshold2為45)
(右下圖中,調整Canny套件中的threshold1為20、threshold2為45)
依照我的程式成果比較下來,我們可以得到結論是:
Sobel:
- 用於提取邊緣,可以利用快速卷積函數,簡單有效,因此應用廣泛。
- 缺點是Sobel算子並沒有將圖像的主題與背景嚴格地區分開來,所以提取的圖像輪廓有時並不能令人滿意,但是算法具體實現很簡單。
Canny:
- 在線條上的呈現較Sobel要好一些,Canny算子是一個具有濾波,增強,檢測的多階段的優化算子。
- 它實現起來較為麻煩,需視圖片雜訊多寡,調整threshold。
包括原圖在內,我的程式在每一次將圖片做轉換時(灰階、模糊化、邊緣線條),都會儲存一次當前圖片,如下圖所示,使用的是openCV的imwrite套件。
沒有留言:
張貼留言