如何找到白色和黑色盒子的轮廓?

时间:2018-03-18 05:40:03

标签: python opencv

我目前正在处理一个图片,我必须找到盒子外部区域。但我没能找到白色和黑色的盒子区域。

输入图片: https://i.imgur.com/gec9eP5.png

输出图片: https://i.imgur.com/Giz1DAW.png

更新编辑: 如果我使用HLS而不是HSV我可以找到3个盒子区域,但仍然缺少2个。 这是新输出: https://i.imgur.com/eUqltKI.png

这是我的代码:

import cv2
import numpy as np
img = cv2.imread("1.png")
imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_blue = np.array([0,50,0])
upper_blue = np.array([255,255,255])
mask_blue = cv2.inRange(imghsv, lower_blue, upper_blue)
_, contours, _ = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
im = np.copy(img)
cv2.drawContours(im, contours, -1, (0, 255, 0), 2)
cv2.imwrite("contours_blue.png", im)

2 个答案:

答案 0 :(得分:0)

您使用

生成的面具
mask_blue = cv2.inRange(imghsv, lower_blue, upper_blue)

根本不包括底行,因此无法使用

检测这些大纲
_, contours, _ = cv2.findContours(mask_blue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

您可以尝试使用多个蒙版/阈值来考虑不同的颜色范围并合并检测到的轮廓。

答案 1 :(得分:0)

当您处理许多不同颜色的对象(事先不知道)并且背景颜色不一定与所有对象颜色明显不同时,颜色通道阈值不是最佳解决方案。多个阈值/条件的组合可以解决这个特定图像的工作,但是这种相同的组合可能因输入稍有不同而失败,所以我认为这种方法通常不太好。

我认为这个问题非常基础,所以我建议坚持一个简单的方法。例如,如果您在图像上应用Sobel运算符,则会得到如下结果。某些边框上的结果强度较弱,因此我将图像颜色反转以使其更清晰可见。

react-adsense

网上有很多关于Sobel运营商的教程,所以我不打算在这里详细介绍。在您的输入图像上没有噪音,因此框外和框内的强度为零。因此,我建议屏蔽所有零值。如果在此之后进行轮廓检测,则每个方格最终会有两个轮廓 - 一个位于边框的内侧,另一个位于边框的外侧。如果您只想在外边框上提取轮廓,请参阅OpenCV文档中轮廓雇用的工作原理。如果你想在边框上精确地 ,请自我修复外部轮廓和侵蚀。

相关问题