识别最密集的区域/集群

时间:2018-02-07 16:41:49

标签: python numpy image-processing scipy scikit-learn

我有一个像这样的图像:

enter image description here

我想自动识别左上角的密集白框区域,然后填充它并将剩余的图像变黑。产生这样的东西:

enter image description here

基本上,我只想返回最密集的集群的坐标。我尝试了特殊的方法,如侵蚀,扩张和二元闭合,但它们并不能满足我的需求。我不确定我是否可以在这里使用k-means?寻找有效的方法,任何帮助表示赞赏。

2 个答案:

答案 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 处查找标签,并将标记图像中的所有像素与该标签相等来进行此操作。

这应该会给你一个连通,紧凑的区域。你可以找到这个区域的边界框,并在你的图像上绘制它,如果你真的想要强制找到的区域是一个盒子。