4

I have a list of shapes (list of points) e.g. rectangles which I want to group/cluster together.

This is what I have:

enter image description here

And this is what I want to achieve.

enter image description here

How to do it?

I already looked at some clustering techniques, e.g., kmeans but it seems there must be a better way.

Thanks!

Stef
  • 13,242
  • 2
  • 17
  • 28
dknaack
  • 60,192
  • 27
  • 155
  • 202
  • 2
    Hi! Great question. I added tag [aabb] (axis-aligned bounding box) since the clusters must be axis-aligned bounding boxes. – Stef May 12 '22 at 22:40
  • "there must be a better way": I doubt it, there is no universal clustering method. And I guess that the results you expect are based on unsaid rules, that no algorithm can guess. –  May 13 '22 at 10:20
  • Probably yes. I make some good progress using hierarchical clustering. – dknaack May 13 '22 at 10:59

1 Answers1

1
  1. Select a 'clustering distance' CD, i.e. the maximum distance between 2 rectangles at which they would be considered a cluster
  2. Compute a second set of rects, each of which correspond to their source rects as follows:
    [xmin', ymin', xmax', ymax'] = [xmin - CD/2, ymin - CD/2, xmax + CD/2, ymax + CD/2]
  3. Sort all xmin'-s and xmax'-s and select all pairs of rectangles where either xmin' or xmax' of the first is within (xmin', xmax') range of the second; these are the potential clustering targets
  4. Sort all ymin'-s and ymax'-s and check if the pairs from the previous step do indeed intersect; form clusters
  5. Iteratively merge clusters that intersect on at least 1 of the rects they contain; e.g. cluster (rect #3, rect #10) and cluster (rect #10, rect #7) are to be merged, thus becoming a (rect #3, rect #7, rect #10) cluster
hidefromkgb
  • 5,834
  • 1
  • 13
  • 44