我必须从图像中提取一个区域(不能透露该图像)。 在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中,那就更好了。
答案 0 :(得分:0)
所以我继续使用建议的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]
这里质心是我得到的分数,我分为象限,因为在我的问题中,分数需要来自所有四个qaudrants。我已经完成了四点的所有可能组合。 我发现了对角线,即中心的角度。 制作一个列表,其中包含对角线长度(最小到最大)的比率,角度和最短对角线的长度。 我使用了矩形对角线长度相等的属性。这对现在非常有用。我不知道如何使用其他属性因此它被搁置。在最后的答案中,我得到了最好的矩形(当没有点制作sqaure时,它也不关心矩形的大小)。
答案 1 :(得分:0)
也许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.
答案 2 :(得分:-1)
最好的是imcrop(I,rect);
,其中rect定义为
rect = [xmin ymin width height]
所以在第一对例如[41,63],[613,66]
XMIN = 41
YMIN = 63
宽度= 613-41
高度= 66-63