【问题标题】:Finding approximate rectangle in from a set of points从一组点中找到近似矩形
【发布时间】:2017-07-08 11:11:29
【问题描述】:

我必须从图像中提取一个区域(不能透露该图像)。 在Abid K Rahman's answer 的帮助下,我获得了图像 Result Image 我已经获得了可能构成一个矩形的点,但找不到一个最近似的矩形。​​

    [[625, 389], [10, 385], [116, 184], [5, 35], [626, 26]]

我们可以假设矩形的所有四个点都在图像的四个不同角落。所以我根据他们的位置把这个系列分成了四个不同的组。

    [[[[41, 63]], [[613, 66]]], [[[227, 428], [25, 426], [39, 392]], [[612, 394]]]]

但我无法继续前进。我想提取大约形成一个矩形的点。 如果答案在 python 中就更好了。

【问题讨论】:

  • 这就是你给我们的全部吗?您可以学习 How to Ask a good question 并创建一个 Minimal, Complete, and Verifiable 示例。这让我们更容易为您提供帮助。
  • @StephenRauch 我有限制。虽然我更新了一点。
  • 任何优化问题都需要约束。您没有指定任何内容。建议尝试弄清楚您的应用程序将认为什么是合适的矩形的描述。
  • 我建议使用广义霍夫变换。
  • 我可以建议的另一种方法可能是使用 RANSAC 并一次使用四个点,每次您测试相对于其他每个点的成对角度并检查最大数量的点包含在矩形中。我没有写答案,因为我不知道这是否可行。

标签: python matlab opencv numpy


【解决方案1】:

最好的事情是imcrop(I,rect); rect 被定义为

rect=[xmin ymin 宽度高度]

所以在第一对例如 [41,63],[613,66]

xmin=41

ymin=63

宽度=613-41

身高=66-63

【讨论】:

  • 再次不是正确答案。再次仔细阅读问题。需要根据一组点自动定义矩形。
【解决方案2】:

所以我继续使用rayryeng 建议的东西编写我的代码并想出了这个。

c = [[[] for x in range(2)] for y in range (2)]
for xy in centroids:
    x_i = xy[0]*2/col
    y_i = xy[1]*2/row
    c[y_i][x_i].append(np.array(xy))

combination = []
combination = np.array([ np.array([q1,q2,q3,q4]) for q1 in c[0][0] for q2 in c[0][1] for q3 in c[1][1] for q4 in c[1][0]])

if len(combination)>0 :
    key = 0
    property = [[ 0 for j in range(4)] for i in range(len(combination))]
    for i in range(len(combination)):
        q = combination[i]
        d1,d2 = q[2]-q[0],q[1]-q[3]
        d1_len,d2_len = np.sqrt(sum(d1**2)),np.sqrt(sum(d2**2))
        angle = math.degrees(math.acos(sum(d1*d2)/(d1_len*d2_len)))
        if d1_len > d2_len:
            r,extent = int(100*d1_len/d2_len),d2_len
        else:
            r,extent = int(100*d2_len/d1_len),d1_len
        property[i] = [r,angle,extent,i]
    property.sort(key = lambda x:x[0])
    key = property[0][3]
    combination = combination[key]

这里的质心是我得到的点,我将其划分为象限,因为在我的问题中,这些点需要来自所有四个象限。我已经做了所有可能的四点组合。 我找到了对角线,中心的角度。 列出了一个列表,其中包含对角线长度(最小到最大)、角度和最短对角线长度的比率。 我使用了矩形的对角线长度相等的属性。目前这非常有用。我不知道如何使用其他属性,因此它被搁置了。在最终答案中,我得到了最好的矩形(当没有点可以制作正方形时,它也不关心矩形的大小)。

【讨论】:

    【解决方案3】:

    也许 Python Shapely 库可以提供帮助。

    例子:

    from shapely.geometry import MultiPoint
    points = MultiPoint([(0.0, 0.0), (1.0, 1.0), ... ])
    
    points.bounds
    # A (minx, miny, maxx, maxy) tuple.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      相关资源
      最近更新 更多