Нахождение соответствующих прямоугольных координат по заданным точкам сетки - PullRequest
2 голосов
/ 13 июня 2019

Я обработал изображение, используя openCV, чтобы получить шаблон изображения.Шаблон изображения представлен 2 Python списками горизонтальных и вертикальных линий соответственно.Линии представляют границы шаблонов.

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)) по порядку слева направо, сверху вниз,Теперь я хочу использовать эти координаты, чтобы вырезать прямоугольники из изображения.

Размер списка corners варьируется, и шаблоны складываются, что означает, что у них есть общие точки.Учитывая список точек, а также размер списков линий fx и fy:

Как использовать точки для обрезки прямоугольников?

Не стесняйтесь менять get_corners(), если вам нужно.

Вот пример: Обнаружение шаблона дает 4 возможных прямоугольника в 2x2.Это означает, что список points содержит всего 9 значений.

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

Я могу обрезать первый прямоугольник, используя что-то вроде этого:

x1,y1 = points[0] #top left corner of the first pattern
x2,y2 = points[5] #bottom right corner of the first pattern
#rectangle
rectange = img[y1:y2,x1:x2]

Ответы [ 2 ]

3 голосов
/ 20 июня 2019

Пронзить в темноте здесь, но это ваше промежуточное изображение?Я также предполагаю, что вы различаете квадраты и прямоугольники, то есть вам не нужны квадраты, только прямоугольники.

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))
0 голосов
/ 23 июня 2019

Ваш вопрос немного неясен, но вот решение, в котором предполагается, что ваша переменная img является массивом с нулевыми значениями (поскольку вопрос помечен 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 массива.

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]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...