1.撰寫一個程式,利用數學型態學影像處理運算(erode(), dilate()等函式),計算出所附
圖像(共三張)每張圖像中圍棋個數。
2.環境設置:
C++
visual studio 2017
opencv 3.4.3
3.實作:
(1)以灰階圖讀入圖片。
(2)將圖片模糊化去雜訊,我使用GaussianBlur來去雜訊。
(3)之後將圖片反二值化,變成黑底白棋。
(4)使用getStructuringElement當作是dilate和erode的參數,我用的是以正方形邊長為5
(RECTangle (5.5))。
(5)先做dilate(擴張),把棋子的白色部分覆蓋棋子內大部分的黑色部分,在做erode(侵蝕)將白色部分由外部縮小,我的erode次數根據不同圖片做不同次數。
(6)使用findContours(),根據外部輪廓存入掃描到的白色部分,之後再取findContours()第2個參數contours的size,也就是存入的點的個數當成是偵測到的棋子數量。
4.結果:原先我使用一般二值化,可是這樣findContours會找不出輪廓,所以我才用反二值化。另外反二值化的話erode跟dilate要顛倒過來用。
第一張:做了20次erode,達到了最接近真實棋子數量的值,再高的話小白點會被消掉,而無法偵測。
第三張:做了18次erode,達到了最接近真實棋子數量的值。
第三張:做了15次erode,達到真實棋子數量的值。
沒有留言:
張貼留言