作業說明:
請撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附圖像(共三張)每張圖像中圍棋個數。
a. 請在部落格呈現經由數學型態學影像處理運算後的圖像,同時要呈現你程式輸出棋子數量的螢幕截圖。
b. 程式不一定可以算出正確棋子數量,越接近正確答案越好!
執行環境:
- windows10
- Python 3.6
- OpenCV 4.5.1
實作方式:
1. 讀取圖片,並將其resize為(1036,690)
2. 對圖片做二質化
3. 使用 cv2.HoughCircles 找出圖片中圓形部分
4. 將找到的圓畫在二質化的圖片上
5. 使用cv2.getStructuringElement設定kernal為橢圓形(經過測試橢圓的效果較佳)
6. 先對圖片做兩次膨脹(去除亮點雜訊)
7. 在對圖片做九次侵蝕(分離棋子)
8. 在對圖片做五次膨脹(使結果明顯化)
9. 使用cv2.findContours計算共有幾顆棋子
執行結果:
1. circle_IMG_5702.JPG
原圖 |
侵蝕與膨脹處理後的圖 |
將結果與原圖重疊 實際數量:24 辨識結果:24 |
2. circle_IMG_5703.JPG
原圖 |
侵蝕與膨脹的結果 |
將結果與原圖重疊 實際數量:31 辨識數量30 |
原圖 |
侵蝕與膨脹結果 |
將結果與原圖重疊 實際數量:31 辨識數量:31 |
一開始打算單純使用侵蝕與膨脹的技巧做數量的辨識,
但是經過不斷嘗試更改重複侵蝕與膨脹的次數、侵蝕與膨脹的交替使用、多種kernal的組合...等,
都無法解決不同的圖片都需要各自調整參數的問題,
後來加上了HoughCircles,
才得以完成在不修改參數的情況下98.8%的辨識率((24+30+31)/(24+31+31))
沒有留言:
張貼留言