过去两周我一直坚持这个问题,试图找到一种方法,将一组矩形/正方形组合成一个更大的矩形/正方形,包含感兴趣的区域。这项工作是用Python完成的。
我正在研究一种能够在任何表面的X和Y方向获取强度信息的仪器。我可以在分辨率阵列中进行我的实验,但正如预期的那样,更高的分辨率会显着增加实验的时间范围。我的目标是以低分辨率进行实验,然后进行更高分辨率的实验,但仅限于有趣的领域。我附上了一张图片,告诉你我的意思。
除了黄色/橙色斑点之外,我对其他任何东西都不是特别感兴趣。所以我正在提取与我的最小阈值相对应的一定强度的区域。我最终得到XY中心,我扩展到矩形/正方形大小。我希望下面的图片有5个感兴趣的区域,这将包含热点周围的最小区域。
问题在于矩形的数量 - 它纯粹基于峰的强度。我想通过将重叠的矩形组合成一个大矩形或者仅保留一个代表其他矩形的矩形,将它从53减少到5。
到目前为止,我已经尝试了许多不同的方式来看待它,但我无法让它发挥作用。我已经探索了wx
模块,我可以检查矩形是否重叠,检查点是否彼此靠近,中心点是否在其他矩形内等等...
我故意没有发布任何代码,因为它们都没有特别好用......
如果你们中的任何人能够帮助解决这个问题,我将永远感激不尽!
更新1 感谢Kenney,我有一个可以完成我想做的工作代码。到目前为止,我只测试了一组结果,但是一旦我分析了更多结果,我会再次更新。看看结果图像。
答案 0 :(得分:3)
这是一个对矩形进行后处理以对其进行聚类的示例。 我从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