【问题标题】:Identifying the densest region/cluster识别最密集的区域/集群
【发布时间】:2018-07-18 01:09:51
【问题描述】:

我有这样的图像:

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

本质上,我只想返回最密集集群的坐标。我尝试过诸如腐蚀、膨胀和二进制关闭等临时方法,但它们并不完全适合我的需求。我不确定我是否可以在这里使用k-means?寻找一种有效的方法,任何帮助表示赞赏。

【问题讨论】:

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


    【解决方案1】:

    您可以稍微腐蚀一下图像,以去除更多的噪点,然后找到轮廓并按区域过滤它们。这是我将使用的(未测试):

        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)
    

    【讨论】:

      【解决方案2】:

      这里一个正确的方法是应用一个大的平方平均滤波器。如果您知道您要查找的盒子的大致尺寸,则将该尺寸与过滤器相匹配。应用此过滤器后,图像中的最大像素值将位于最密集区域的中间。我们称这个点为 p

      接下来,对原始图像应用分割和连通分量标记。从您的示例图像中,您要查找的框似乎已连接。您可能想要应用一些形态学操作来确保它是连接的。您还可以绘制一个以 p 点为中心的大小合理的斑点,它将许多小区域连接在一起,形成一个密集区域。

      接下来,移除除了包含点p的所有连接组件。您可以通过在像素 p 处找到标签,并比较标记图像中的所有像素与该标签是否相等来做到这一点。

      这应该会为您留下一个连接的、紧凑的区域。如果您真的想强制找到的区域是一个框,您可以找到该区域的边界框,并将其绘制在您的图像上。

      【讨论】:

        猜你喜欢
        • 2019-12-04
        • 1970-01-01
        • 2015-08-05
        • 2018-10-12
        • 1970-01-01
        • 2018-09-11
        • 2016-02-28
        • 2016-09-24
        • 2019-06-22
        相关资源
        最近更新 更多