2019年6月2日 星期日

1051549的作業5

Morphological Image Processing

請撰寫一個程式,利用數學型態學影像處理運算,計算出所附圖像共三張,列出每張圖像中圍棋個數。

環境需求

  • windows 10
  • python 3.7
  • opencv 4.0
  • numpy 1.15.1
  • matplotlib 2.2.3

實現方法

主要方法是偵測每個物件的輪廓,計算有輪廓形狀的物件數量,根據輪廓內的面積篩掉棋子上的反光的雜訊
  1. 一開始使用imread(image, 0) ,把讀進來的圖轉成灰階圖
  2. 讓圖像的細節模糊化,用GaussianBlur(),降低雜訊
  3. 再用open = morphologyEx(image, MORPH_OPEN, kernel),用open morphology方法去除周遭的雜訊,這裡我設kernel為(30,30)大小的矩形,可以有效篩掉大多數的棋子上的反光
  4. 將open之後的結果做threshold(open, 0, 255, THRESH_BINARY | THRESH_OTSU),這裡用Otsu’s algorithm偵測閾值,所以一開始初始閾值可以隨便給,之後會再修正
  5. 用sobel’s algorithm,偵測物件的邊緣,以偵測x , y軸的邊緣並取絕對值再疊加兩張軸的圖片
  6. findContours(sobel, RETR_LIST, CHAIN_APPROX_SIMPLE)找出所有物件輪廓
  7. 根據findContours找到物件數量,用contourArea()篩選掉剩下的棋子反光雜訊,這裡我以area < 10當作篩選條件,最後統計可能是黑子的數量

運行結果

左圖是原圖,右圖是輪廓偵測完的結果

第一張圖原來是24顆,程式判斷22顆
第二張圖原來是31顆,程式判斷30顆
第三張圖原來是31顆,程式判斷28顆

沒有留言:

張貼留言