【问题标题】:Combining rectangle/square areas into bigger ones - imshow/python将矩形/正方形区域组合成更大的区域 - imshow/python
【发布时间】:2015-11-30 01:18:28
【问题描述】:

在过去的两周里,我一直被这个问题所困扰,试图找到一种方法将一组矩形/正方形组合成一个更大的包含感兴趣区域的矩形/正方形。这项工作是在 Python 中完成的。

我正在开发一种仪器,该仪器可以获取任何表面的 X 和 Y 方向的强度信息。我可以在一系列分辨率下进行实验,但正如预期的那样,更高的分辨率会显着增加实验的时间范围。我的目标是在低分辨率下进行实验,然后进行更高分辨率的实验,但仅限于有趣的领域。我附上了一张图片来告诉你我的意思。

除了黄色/橙色斑点之外,我对任何东西都不是特别感兴趣。所以我正在提取与我的最小阈值相对应的一定强度的区域。我最终得到了扩展为矩形/正方形大小的 XY 中心。我希望下图有 5 个感兴趣的区域,包括热点周围的最小区域。

不幸的是,我最终得到的是这个(总共 53 个矩形代表 5 个区域):

问题在于矩形的数量 - 它纯粹基于峰的强度。我想通过以下方式将其从 53 减少到 5 1)将重叠的矩形组合成一个大矩形或 2)只保留一个代表其他矩形的单个矩形。

到目前为止,我已经尝试了许多不同的方式来看待它,但我无法让它发挥作用。我探索了wx 模块,我可以在其中检查矩形是否重叠,检查点是否彼此靠近,中心点是否在其他矩形内,等等...

我故意没有发布任何代码,因为它没有一个特别好用......

如果你们中的任何人能对此提供帮助,我将永远感激不尽!

更新 1 多亏了 Kenney,我有了一个可以做我想做的工作的代码。到目前为止,我只在一组结果上对其进行了测试,但一旦我分析更多,就会再次更新。看看生成的图像。

【问题讨论】:

  • 测试重叠矩形看起来像是要走的路:如果您添加第二个与预先存在的第一个矩形重叠的矩形,您可以扩展第一个矩形的边界并丢弃第二个。如果你这样做,你应该得到 5 个矩形。
  • @Kenney 你知道最好的方法是什么吗?我已经尝试过了,但我仍然得到不正确的矩形数量..
  • 不能保证矩形不会重叠,但我会用最小的上/左和最大的下/右坐标调整现有矩形。如果有多个匹配项,您可能必须选择重叠区域最大的矩形。或者,检查新矩形的中心是否在现有矩形内。我很想看看你的尝试和你得到的结果?
  • 我注意到在您的输出中,即使您有 53 个矩形(看起来更少),它们也被聚集成五个不重叠的组。您可以对这些矩形进行后处理以对它们进行分组,然后平均它们的边界。
  • 1) 我正在开发一个符合您建议的代码版本。 2)图像确实有所有 53 个矩形,XY 位置的差异可能非常小。我同意,这 5 个区域的表现很好,所以如果我可以将它们聚集在一起,然后取它们的平均值,它会起作用。我只是不确定如何将它们组合在一起,按 X 或 Y 或 XY 对它们进行排序不起作用。

标签: python pandas matplotlib wxwidgets


【解决方案1】:

这是一个对矩形进行后处理以对它们进行聚类的示例。 我从codereview 获取了一些实用程序代码,因为我对python 完全陌生:

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Rect(object):
    def __init__(self, p1, p2):
        '''Store the top, bottom, left and right values for points 
               p1 and p2 are the (corners) in either order
        '''
        self.left   = min(p1.x, p2.x)
        self.right  = max(p1.x, p2.x)
        self.bottom = min(p1.y, p2.y)
        self.top    = max(p1.y, p2.y)

    def __str__(self):
         return "Rect[%d, %d, %d, %d]" % ( self.left, self.top, self.right, self.bottom )

def range_overlap(a_min, a_max, b_min, b_max):
    '''Neither range is completely greater than the other
    '''
    return (a_min <= b_max) and (b_min <= a_max)

def rect_overlaps(r1,r2):
    return range_overlap(r1.left, r1.right, r2.left, r2.right) and range_overlap(r1.bottom, r1.top, r2.bottom, r2.top)

这是算法:

rectangles = [

    # A______
    # |      |
    # -------B

    #     A             B
    Rect( Point(10,10), Point(50,70)),
    Rect( Point( 8,10), Point(30,20)),
    Rect( Point(90,90), Point(99,99)),
];


clusters = [];

for rect in rectangles:
    matched = 0;
    for cluster in clusters:
        if ( rect_overlaps( rect, cluster ) ):
            matched=1
            cluster.left   = min( cluster.left,   rect.left   );
            cluster.right  = max( cluster.right,  rect.right  );
            cluster.top    = min( cluster.top,    rect.top    );
            cluster.bottom = max( cluster.bottom, rect.bottom );

    if ( not matched ):
        clusters.append( rect );

print "Clusters:"
for c in clusters:
    print c

【讨论】:

  • 感谢您的回复和帮助...成功了!你是一个救生员。谢谢!查看附件图片以查看结果。
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2011-04-14
  • 2011-05-17
  • 2019-10-26
  • 2011-05-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多