预处理
过滤图像时,一个好主意是对图像进行低通处理或稍微模糊它;这样,相邻像素的颜色会变得更加均匀,因此可以缓解图像上的较亮和较暗的斑点,并防止掩模上出现孔洞。
img = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(img, (15, 15), 2)
lower_green = np.array([50, 100, 0])
upper_green = np.array([120, 255, 120])
mask = cv2.inRange(blur, lower_green, upper_green)
masked_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('', masked_img)
cv2.waitKey()
色彩空间
目前,您正在尝试通过一系列具有不同亮度的颜色来包含图像 - 您需要绿色像素,无论它们是深色还是浅色。这在 HSV 色彩空间中更容易实现。看看我的回答here https://stackoverflow.com/a/45071147/5087436深入研究 HSV 色彩空间。
img = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(img, (15, 15), 2)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
lower_green = np.array([37, 0, 0])
upper_green = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
masked_img = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('', masked_img)
cv2.waitKey()
去除二值图像/掩模中的噪声
The answer https://stackoverflow.com/a/45945827/5087436由...提供恩加尔斯蒂安 https://stackoverflow.com/users/5102963/ngalstyan展示了如何通过形态学很好地做到这一点。你想做的事情叫做opening,这是侵蚀(或多或少只是删除一定半径内的所有内容)和膨胀(无论删除多少内容,都会添加回任何剩余对象)的组合过程。在 OpenCV 中,这是通过以下方式完成的cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html#opening。该页面上的教程展示了它如何很好地工作。
img = cv2.imread('image.jpg')
blur = cv2.GaussianBlur(img, (15, 15), 2)
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)
lower_green = np.array([37, 0, 0])
upper_green = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
opened_mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
masked_img = cv2.bitwise_and(img, img, mask=opened_mask)
cv2.imshow('', masked_img)
cv2.waitKey()
填补空白
在上面,打开被显示为从二元蒙版中去除小块白色的方法。Closing是相反的操作——从图像中删除被白色包围的黑色块。您可以使用与上面相同的想法来做到这一点,但是使用cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html#closing。在您的情况下,在执行上述操作后甚至没有必要这样做,因为面罩没有任何孔。但如果确实如此,您可以通过 close 来关闭它们。你会注意到我的开始步骤实际上移除了底部植物的一小部分。你实际上可以通过关闭来填补这些空白first,然后打开以删除其他地方的杂散位,但这对于此图像来说可能不是必需的。
尝试新的阈值
您可能希望更舒适地使用不同的色彩空间和阈值级别,以了解什么最适合特定图像。它还不完整,界面有点不稳定,但我有一个工具,您可以在线使用它来尝试不同色彩空间中的不同阈值;一探究竟here https://alkasm.github.io/cspaceFilter/如果你愿意的话。这就是我快速找到你的形象的价值的方法。