一、作業題目
請撰寫一個程式,利用數學型態學影像處理運算,計算出所附圖像(共三張)每張
圖像中圍棋個數。
二、開發環境
Windows 10、Python 3.4.6、Opencv 4.0.0、matplotlib 3.0.3
三、解題邏輯
先將圖片二值化後,使用Erosion的技術令其相連的棋子點分開,之後再去計算
有幾個分開的輪廓即可得出棋子個數。
三、解題細節
1.
由於Erosion技術和計算輪廓的技術,在opencv當中都是默認以黑底白物體來判斷,因此在讀進img並二值化完後,我進行了黑白色翻轉的動作(重點程式碼如下)
(thresh, img) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
(thresh, img) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
2.
接著,在使用Erosion技術時,必須設定kernel的形狀大小。這邊由於測試圖三張的棋的重疊程度不太一樣,因此我手動地去更動kernel的大小,並使用200與300兩組大小分別去Erosion,以下是Erosion完的結果
3.
最後一步,去計算輪廓物件的個數,使用到threshold與findContours的技術(重點程式碼如下)
cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.findContours(binary, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.findContours(binary, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
4.
結果呈現
四、過程的截圖
老師給的圖(我重新命名,方便之後跑程式)
圖A,以kernel size 200 和 300,分別跑完的圖
圖B,以kernel size 200 和 300,分別跑完的圖
圖C,以kernel size 200 和 300,分別跑完的圖
沒有留言:
張貼留言