2016-09-24 192 views
3

我試圖爲立體聲應用的棋盤填充孔。棋盤是在微觀尺度因此是複雜的,以避免灰塵如...可以看到:使用OpenCV或Skimage在圖像中填充空洞

enter image description here

因此,角檢測是不可能的。我試着用SciPy的binary_fill_holes或類似的方法,但我有一個完整的黑色圖像,我不明白。

+0

嘗試使用開口 – PSchn

+2

或者反轉圖像,使用查找輪廓,將它們填充黑色並再次反轉 – PSchn

回答

2

可以使用下面的函數,以去除孔中,通過與它的最大的顏色來代替每個像素的顏色的環境像素:

import numpy as np 
import cv2 

def remove_noise(gray, num): 
    Y, X = gray.shape 
    nearest_neigbours = [[ 
     np.argmax(
      np.bincount(
       gray[max(i - num, 0):min(i + num, Y), max(j - num, 0):min(j + num, X)].ravel())) 
     for j in range(X)] for i in range(Y)] 
    result = np.array(nearest_neigbours, dtype=np.uint8) 
    cv2.imwrite('result2.jpg', result) 
    return result 

演示:

img = cv2.imread('mCOFl.png') 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

remove_noise(gray, 10) 

輸入圖像:

enter image description here

出放:

enter image description here

注:由於此函數替換角落像素的顏色太深,你可以起訴cv2.goodFeaturesToTrack功能找到角落和限制去噪的像素

corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 30) 
corners = np.squeeze(np.int0(corners)) 
+0

感謝您的有趣結果! :)它運作良好,但缺點是角落擴散導致我認爲錯誤的增加。或許我可能會在你改正後腐蝕? – user3601754

+0

我認爲是一箇中值過濾器,但它導致同樣的問題。 – user3601754

+1

@ user3601754是的,我正要添加一個解釋。我認爲有一種方式可以通過找到角落並逃避對他們的操作來拒絕。 – Kasramvd

1

您可以使用形態:擴張,然後侵蝕相同的內核大小。