【发布时间】:2018-07-18 01:09:51
【问题描述】:
我有这样的图像:
我想自动识别左上角密集的白框区域,然后填充它并将图像的其余部分涂黑。产生这样的东西:
本质上,我只想返回最密集集群的坐标。我尝试过诸如腐蚀、膨胀和二进制关闭等临时方法,但它们并不完全适合我的需求。我不确定我是否可以在这里使用k-means?寻找一种有效的方法,任何帮助表示赞赏。
【问题讨论】:
标签: python numpy image-processing scipy scikit-learn
我有这样的图像:
我想自动识别左上角密集的白框区域,然后填充它并将图像的其余部分涂黑。产生这样的东西:
本质上,我只想返回最密集集群的坐标。我尝试过诸如腐蚀、膨胀和二进制关闭等临时方法,但它们并不完全适合我的需求。我不确定我是否可以在这里使用k-means?寻找一种有效的方法,任何帮助表示赞赏。
【问题讨论】:
标签: python numpy image-processing scipy scikit-learn
您可以稍微腐蚀一下图像,以去除更多的噪点,然后找到轮廓并按区域过滤它们。这是我将使用的(未测试):
kernel = np.ones((2, 2), np.uint8)
img = cv2.erode(img, kernel, iterations = 2)
#Finding contours of white square:
_, conts, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_SIMPLE)
for cnt in conts:
area = cv2.contourArea(cnt)
#filter more noise
if area > 200: # optimize this number
x1, y1, w, h = cv2.boundingRect(cnt)
x2 = x1 + w # (x1, y1) = top-left vertex
y2 = y1 + h # (x2, y2) = bottom-right vertex
rect = cv2.rectangle(img, (x1, y1), (x2, y2), (255,0,0), 2)
【讨论】:
这里一个正确的方法是应用一个大的平方平均滤波器。如果您知道您要查找的盒子的大致尺寸,则将该尺寸与过滤器相匹配。应用此过滤器后,图像中的最大像素值将位于最密集区域的中间。我们称这个点为 p。
接下来,对原始图像应用分割和连通分量标记。从您的示例图像中,您要查找的框似乎已连接。您可能想要应用一些形态学操作来确保它是连接的。您还可以绘制一个以 p 点为中心的大小合理的斑点,它将许多小区域连接在一起,形成一个密集区域。
接下来,移除除了包含点p的所有连接组件。您可以通过在像素 p 处找到标签,并比较标记图像中的所有像素与该标签是否相等来做到这一点。
这应该会为您留下一个连接的、紧凑的区域。如果您真的想强制找到的区域是一个框,您可以找到该区域的边界框,并将其绘制在您的图像上。
【讨论】: