从一组点求近似矩形

2024-06-23 18:30:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

^{pr2}$

但我不能再往前走了。我想提取一个近似矩形的点。 如果答案是python的话就更好了。在


Tags: 答案answer图像image区域result矩形pr2
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.

所以我继续用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]

这里质心是我得到的点,我把它分成四个象限,因为在我的问题中,这些点需要来自所有四个象限。我把四点结合起来。 我找到了对角线,中心的角度。 列出了其中包含对角线长度(最小值与最大值)之比、角度和最短对角线长度。 我用了矩形的对角线等长的性质。这对现在很有用。我不知道如何使用其他属性,因此它被搁置了。在最后的答案中,我得到了最好的矩形(当没有点来做正方形时,它也不关心矩形的大小)。在

最好的方法是imcrop(I,rect);,其中rect定义为

rect=[xmin ymin宽度高度]

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

x最小值=41

ymin=63

宽度=613-41

高度=66-63

相关问题 更多 >

    热门问题