我有一个像这样的图像:
我想自动识别左上角的密集白框区域,然后填充它并将剩余的图像变黑。产生这样的东西:
基本上,我只想返回最密集的集群的坐标。我尝试了特殊的方法,如侵蚀,扩张和二元闭合,但它们并不能满足我的需求。我不确定我是否可以在这里使用k-means?寻找有效的方法,任何帮助表示赞赏。
答案 0 :(得分:0)
您可以稍微侵蚀图像,去除更多噪点,然后找到轮廓并按区域过滤它们。这是我将使用的(未测试):
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)
答案 1 :(得分:0)
这里的一种正确方法是应用大方形平均滤波器。如果您大致了解您要查找的框的大小,请将该大小与过滤器匹配。应用此滤镜后,图像中的最大像素值将位于最密集区域的中间。我们将此点称为 p 。
接下来,将分段和连接组件标签应用于原始图像。从您的示例图片中,您正在寻找的框似乎已连接。您可能希望应用一些形态学操作以确保它已连接。您还可以绘制以 p 为中心的合理大小的斑点,它将连接许多小区域,这些区域一起形成一个密集区域。
接下来,删除除包含点 p 的组件之外的所有连接组件。您可以通过在像素 p 处查找标签,并将标记图像中的所有像素与该标签相等来进行此操作。
这应该会给你一个连通,紧凑的区域。你可以找到这个区域的边界框,并在你的图像上绘制它,如果你真的想要强制找到的区域是一个盒子。