2020年6月27日 星期六

1061646 影像處理作業6

一、 作業說明: 
請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。
 a. 請在部落格呈現經由數學型態學影像處理運算後的圖像,同時要呈現你程式輸出棋 子數量的螢幕截圖。
b. 程式不一定可以算出正確棋子數量,越接近正確答案越好!

二、 使用環境: 
       1. Visual Studio 2019
       2. OpenCV 4.2.0
       3. 程式語言: C++

三、 實作方法:

主要的流程是:

  1. 圖片做模糊處理
  2. 消除黑棋上的反光
  3. 對圖片做二值化
  4. 偵測邊緣
  5. 算出棋子的輪廓
  6. 篩選
  7. 取得黑棋的數量
使用到的函式有:
  • imread()-讀取圖片
  •  imwrite()-儲存圖片
  • GaussianBlur()-高斯模糊 
  • getStructuringElement()-可以得到特定形狀及大小的結構元素,用來處理侵蝕或膨脹
  • morphologyEx()- Opening,先將圖片做侵蝕再膨脹,把反光消除掉
  • threshold()-圖像二值化
  • Sobel()-用於邊緣偵測
  • convertScaleAbs()-將16點陣圖片轉化成為8點陣圖形進行顯示
  • addWeighted()-影像疊加,用於水平和垂直邊緣偵測後的圖像處理
  • findContours()-可尋找物件(棋子)的輪廓及計算黑棋數量
  • contourArea()-計算物件的面積,用於替除掉因反光而計算到輪廓的物件(反光區域的面積較小)
四、 實作結果:

三張圖黑棋的實際數量依序為:24, 31, 31
偵測後的結果依序為:22, 31,31

左為侵蝕膨脹後的圖像,右為邊緣偵測的圖像




沒有留言:

張貼留言