使用OpenCV或Skimage在图像中填充空洞

使用OpenCV或Skimage在图像中填充空洞

问题描述:

我试图为立体声应用的棋盘填充孔。棋盘是在微观尺度因此是复杂的,以避免灰尘如...可以看到:使用OpenCV或Skimage在图像中填充空洞

enter image description here

因此,角检测是不可能的。我试着用SciPy的binary_fill_holes或类似的方法,但我有一个完整的黑色图像,我不明白。

+0

尝试使用开口 – PSchn

+2

或者反转图像,使用查找轮廓,将它们填充黑色并再次反转 – PSchn

可以使用下面的函数,以去除孔中,通过与它的最大的颜色来代替每个像素的颜色的环境像素:

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

您可以使用形态:扩张,然后侵蚀相同的内核大小。