簡體   English   中英

從一組點中找到近似矩形

[英]Finding approximate rectangle in from a set of points

我必須從圖像中提取區域(無法公開該圖像)。 借助此Abid K Rahman的答案,我獲得了該圖像,作為結果圖像。我獲得了該圖像的要點,它們可能會形成一個矩形,但找不到最近似的矩形。

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

我們可以假設矩形的所有四個點都將位於圖像的四個不同角中。 因此,我根據位置將其分為四個不同的組。

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

但是我無法繼續前進。 我想提取大約構成矩形的點。 如果答案在python中,那就更好了。

因此,我繼續使用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]

這里的質心是我得到的點,我將其划分為多個象限,因為在我的問題中,這些點必須來自所有四個象限。 我已經將所有四點結合在一起。 我找到了對角線,即中心的角度。 制成一個列表,其中包含對角線的長度比(最小到最大),角度和最短對角線的長度。 我使用了矩形的對角線長度相等的屬性。 目前,這非常有用。 我不知道如何使用其他屬性,因此保持不變。 在最后的答案中,我得到了最好的矩形(當沒有要繪制正方形的點時,它也不在乎矩形的大小)。

也許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.

最好的事情是imcrop(I,rect); rect定義為

rect = [xmin ymin width height]

因此,例如第一對[41,63],[613,66]

xmin = 41

ymin = 63

寬度= 613-41

高度= 66-63

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM