【问题标题】:Fill holes holes/area in a binary image using OpenCV使用 OpenCV 填充二进制图像中的孔洞/区域
【发布时间】:2021-08-11 11:27:14
【问题描述】:

我有下面的预处理大米图像。我想用黑色填充大米,然后执行逆运算以找到轮廓。我正在尝试使用侵蚀/膨胀操作但不工作。下面是我正在使用的代码 sn-p。

首先我使用了阴影去除算法,然后使用了自适应阈值,它给出了输入图像。现在,我想将输入图像更改为输出图像。

原图:

输入图像:

所需的输出图像:

代码片段:

oposite = cv2.bitwise_not(img)

#Erosion
kernel = np.ones((3,3),np.uint8)
erosion = cv2.dilate(des,kernel,iterations = 1)
erosion = cv2.bitwise_not(erosion)
im_out = oposite + erosion

cv2.imshow("output", im_out)
cv2.waitKey(0)

【问题讨论】:

  • 什么是“des”图像?您应该先反转图像,然后进行膨胀,这应该可以。您可能需要稍微调整一下内核大小。
  • 您的“期望输出”是原始图像。您应用了无法撤消的非线性变换。因此,您无法从转换后的图像中检索原始图像。
  • 'des' 是'相反的图像'。它的拼写错误。有没有办法使用floodfill?
  • 洪水填充也会填充大米之间的洞。最好的办法是检测内核,然后将它们绘制为填充形状。
  • @RajatHada 我添加了一个答案。请让我知道它是否解决了您的问题,如果没有,为什么。谢谢。

标签: python numpy opencv image-processing computer-vision


【解决方案1】:

您可以使用cv2.cvtColor() 方法中的cv2.COLOR_BGR2HSV 标志和cv2.inRange() 方法来创建HSV 掩码。我基本上把最大饱和度值从255改成了100

import cv2
import numpy as np

img = cv2.imread("rice.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 0])
upper = np.array([179, 100, 255])
mask = cv2.inRange(img_hsv, lower, upper)
cv2.imshow("Mask", mask)
cv2.waitKey(0)

输出:


如果您希望使颗粒更细,您可以将最大色调值从179 调低到111,同时将最大饱和度值调低为100

import cv2
import numpy as np

img = cv2.imread("rice.jpg")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower = np.array([0, 0, 0])
upper = np.array([111, 100, 255])
mask = cv2.inRange(img_hsv, lower, upper)
cv2.imshow("Mask", mask)
cv2.waitKey(0)

输出:

【讨论】:

  • 它解决了问题:)。我将使用具有更多阴影的图像检查这种方法。
猜你喜欢
  • 2017-02-02
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多