После обрезки изображения, как найти новые координаты ограничительной рамки? - PullRequest
0 голосов
/ 08 января 2020

Вот изображение чека, которое у меня есть, и я подготовил его, используя matplotlib,

# x1, y1, x2, y2, x3, y3, x4, y4
bbox_coords = [[650, 850], [1040, 850], [1040, 930], [650, 930]]

image = cv2.imread(IMG_FILE)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

fig, ax = plt.subplots(figsize=(20, 20))
ax.imshow(gray, cmap='Greys_r'); 
rect = Polygon(bbox_coords, fill=False, linewidth=1, edgecolor='r')
ax.add_patch(rect)
plt.show()

print(gray.shape)
(4376, 2885)

receipt image

Затем я обрезал исходное серое изображение и снова нанесил его с такими же координатами ограничительной рамки, и вот результат:

# cropped the original image    
gray_new = gray[25:4314, 147:2880] 

fig, ax = plt.subplots(figsize=(20, 20))
ax.imshow(gray_new, cmap='Greys_r'); 
rect = Polygon(bbox_coords, fill=False, linewidth=1, edgecolor='r')
ax.add_patch(rect)
plt.show()

print(gray_new.shape)
(4289, 2733)

cropped receipt

Итак, я ищу способ сделать ограничивающий прямоугольник для обрезанного изображения . Я не мог понять, как мне этого добиться.

Редактировать:

Вот еще одно изображение, если вы хотите повторить вопрос, receipt-2, и это b-box координаты для изображения [1638,1462,2974,1462,2974,1549,1638,1549].

Ответы [ 2 ]

4 голосов
/ 08 января 2020

Если вы обрезали 25 пикселей слева и 147 пикселей сверху, то вам нужно вычесть 25 пикселей из всех значений X и 147 пикселей из значений Y, поскольку все элементы на изображение переместилось на 25 пикселей влево и на 147 пикселей вверх.

box_coords = [
    [650-25,  850-147],
    [1040-25, 850-147],
    [1040-25, 930-147],
    [650-25,  930-147]
]

print(bbox_coords)

РЕДАКТИРОВАТЬ: Используя код

bbox_coords = [[650, 850], [1040, 850], [1040, 930], [650, 930]]

bbox_coords = [[x-25, y-147] for x,y in bbox_coords]

print(bbox_coords)

BTW: и не имеет значения, сколько пикселей вы обрезали справа и снизу.


РЕДАКТИРОВАТЬ: Расчет для изменения масштаба изображения

Расчет размера с сохранением пропорций

old_width = 4376
old_height = 2885
new_width = 550
#new_height = 270 # doesn't keep proportion
new_height = int(new_width/(old_width/old_height)) # keep proportion

print('new size:', new_width, new_height)
print('proportions:', (old_width/old_height), (new_width/new_height))

new_image = resize(original_img, shape=(new_width, new_height))

Рассчитать положение при изменении размера изображения (я предполагаю, что оно не сохраняет пропорции).

scale_x = old_width/new_width
scale_y = old_height/new_height

print('scale:', scale_x, scale_y)

bbox_coords = [[int(x/scale_x), int(y/scale_y)] for x,y in bbox_coords]

print(bbox_coords)

Если изображение сохраняет предложение, то scale_x == scale_y, и вы можете рассчитать и использовать только одну шкалу для всех значений.

1 голос
/ 08 января 2020

Вы должны переместить координаты многоугольника, то же самое количество, которое вы обрезали в x и в y координатах.

Примите во внимание, что когда вы применяете gray_new = gray[25:4314, 147:2880], это означает [rows, columns], поэтому для графика вы удаляете первые 25 пикселей по оси y и первые 147 пикселей по оси x.

Результатом будет

bbox_coords = [[x - 147, y-25] for x, y in bbox_coords]

и в значениях:

bbox_coords = [[503, 825], [893, 825], [893, 925], [503, 925]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...