查找给定网格点的相应矩形坐标

时间:2019-06-13 08:18:46

标签: python-3.x algorithm opencv

我已经使用openCV处理图像以获得图像图案。图像图案分别由水平线和垂直线的2个 Python 列表表示。线条代表图案的边界。

services.AddScoped<IUserClaimsPrincipalFactory<IdentityUser>, ApplicationClaimsIdentityFactory>(); fx = horizontal lines

每个列表是根据距图像左上角的距离顺序排列的。接下来,我使用以下方法计算发现的线的交点:

fy = vertical lines

这应该给我def get_corners(fx,fy): corners = [] for x_line in fx: for y_line in fy: corner = get_intersection(x_line,y_line) if corner is not None: corners.append(corner) (格式为corners),从左到右,从上到下。现在,我想使用这些坐标将矩形裁剪出图像。

(x,y)列表的大小各不相同,并且模式也有所不同,这意味着它们有共同点。给定点列表,线cornersfx的列表的大小和大小:

如何使用这些点裁剪矩形?

如果需要,可以随时更改fy

这里是一个示例:模式检测在2x2中产生4个可能的矩形。这意味着列表get_corners()中总共有9个值。

points

我可以使用以下方式裁剪第一个矩形:

Points: [[],[],[],
         [],[],[],
         [],[],[]]

2 个答案:

答案 0 :(得分:3)

这里暗中刺伤,但这是您的中间形象吗?我还假设您要区分正方形和矩形,也就是说,您不希望正方形,而只希望矩形。

enter image description here

在这种情况下,我将使用以下步骤:

cnt_rectangles = 0
rectangle_list = []
for index in np.arange(len(points)-1):
   p = points[index]
   q = points[index+1]
   if (p[0] == q[0]) || p[1] == q[1]
       #the rectangle vertices must not have the same column or row. reject.
       continue
   else if abs(p[0] - q[0]) == abs(p[1] - q[1]):
       #this is a square. reject
       continue
   else:
       #this is a rectangle
       cnt_rectangels+=1
       rectangle_list.append((p, q))

答案 1 :(得分:0)

您的问题尚不清楚,但是这里的解决方案假定您的img变量是一个numpy数组(因为问题用opencv标记),并且在corners中具有交点索引。请注意,我修改了get_corners()函数以按行而不是单个平面数组来构建角,以便于处理,就像您指出的那样。

import numpy as np

def get_corners(fx, fy):
    corners = []
    for x_line in fx:
        row = [] # NOTE: we're building rows here!
        for y_line in fy:
            corner = get_intersection(x_line, y_line)
            if corner is not None:
                row.append(corner)
        corners.append(row)

def get_crops(img, corners):
    crops = []
    for i, row in enumerate(corners[0:-1]):
        for j in range(len(row) - 1):
            x1, y1 = row[j]
            next_row = corners[i+1]
            x2, y2 = next_row[j+1]
            # this slicing works with my test_img,
            # but you may need to adjust it for yours
            crops.append(img[x1:x2+1, y1:y2+1])
    return crops

test_corners = [
    [ [0, 0], [0, 1], [0, 2] ],
    [ [1, 0], [1, 1], [1, 2] ],
    [ [2, 0], [2, 1], [2, 2] ],
]

test_img = np.array(corners) # test img to easily see indices

crops = get_crops(test_img, test_corners)

for i, crop in enumerate(crops):
    print("crop [{}]: {}\n".format(i, crop))

这是测试运行的输出。当然,真实的图像还会有其他数据,但这显示了如何对我的test_img numpy数组进行切片。

crop [0]: [[[0 0] [0 1]]
           [[1 0] [1 1]]]

crop [1]: [[[0 1] [0 2]]
           [[1 1] [1 2]]]

crop [2]: [[[1 0] [1 1]]
           [[2 0] [2 1]]]

crop [3]: [[[1 1] [1 2]]
           [[2 1] [2 2]]]