【问题标题】:Filling holes in image with OpenCV or Skimage使用 OpenCV 或 Skimage 填充图像中的孔
【发布时间】:2017-02-02 07:11:04
【问题描述】:

我正在尝试为立体应用的棋盘填补漏洞。棋盘是微尺度的,因此避免灰尘很复杂......如您所见:

因此,角落检测是不可能的。我尝试使用 SciPy 的 binary_fill_holes 或类似方法,但我有一个全黑的图像,我不明白。

【问题讨论】:

  • 尝试使用开口
  • 或者反转图像,使用查找轮廓,将它们填充黑色并再次反转

标签: python opencv numpy scipy scikit-image


【解决方案1】:

这里有一个函数,用它的大多数相邻像素的颜色替换每个像素的颜色。

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)

输入图片:

输出:

注意:由于这个函数也替换了角落像素的颜色,你可以使用cv2.goodFeaturesToTrack函数来查找角落并限制该像素的去噪

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

【讨论】:

  • 感谢您提供有趣的结果! :) 它运作良好,但缺点是角落的扩散会导致我认为的错误增加。也许我可以在你更正后被侵蚀?
  • 我想到了一个中值滤波器,但它也解决了同样的问题。
  • @user3601754 是的,我正要对此添加解释。我认为有一种方法可以通过找到角落并逃避对它们的操作来拒绝它。
  • 是的,我无法使用“cv2.findChessboardCorners”功能检测角落:(
  • 这和腐蚀图像差不多吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2018-11-26
    • 2015-11-27
    相关资源
    最近更新 更多