撰寫一個程式,讀取一張256 色灰階圖像或 RGB 全彩圖像(.bmp 或.jpg 圖像格式都可) ,利用Sobel Operators 偵測圖像邊緣,並以邊緣偵測為基礎(如彩色圖像針可先將圖片 由 RGB 轉換至HIS 或 YUV, YCbCr 等色彩空間,只需對亮度 Channel I 或 Y 處理,再 轉回 RGB 即可),設計一個類似素描線條自畫像程式。(如果可以分析邊緣偵測所得到 的點,結合成線條方式呈現更佳!)
二. 環境
- Windows 10
- Visual Studio 2017 C# with EmguCV 3.4.3 (Nuget)
(EmguCV為OpenCV在.Net平台上的包裝套件,C#可直接新增專案利用Nuget套件管理來快速安裝EmguCV,缺點就是新專案都要重新安裝一次)
三. 程式說明
這次使用3.X所推薦的Mat存取方式來對圖像操作,相關的函數都包裝在CvInvoke class底下,用法跟C++的方式極為相似。
求邊緣是影像辨識重要的一步,先求出需要辨識的物體範圍後,在做後續的動作就能不必理會不需要的圖像資訊、還能縮小範圍加快運算速度。
這次作業要求用Sobel運算子來求邊緣,程式裡提供的三個方式來做比較,分別為:
- Sobel_1: 直接對圖片做Sobel運算,求出X和Y的導數後和合併來求邊緣
- Sobel_2: 先將圖片轉成Hls顏色空間,利用split取出亮度的channel,然後只對亮度做Sobel運算,之後再將做完的channel合併回去,在轉回RGB顏色空間
- Sobel_3: 大致與Sobel_2操作一樣,但最後會跟原圖做AND運算,所以最後的圖是(Sobel_2 AND 原圖)之後的成果
官方API文件說明可參考: Here
四. 程式結果 (程式有提供比較原圖功能)
Fig5~8. 分別為原圖、Sobel_1、Sobel_2、Sobel_3的結果
沒有留言:
張貼留言