裁剪图像后,如何找到新的边界框坐标?

After cropping a image, how to find new bounding box coordinates?

这是我得到的一张收据图片,我用 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)

然后,我裁剪了原始灰度图像并使用相同的边界框坐标再次绘制它,结果如下,

# 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)

所以,我正在寻找一种方法来制作 边界框以适合裁剪后的图像 。我不知道如何实现它。

编辑:

如果您想复制问题,这里有另一张图片,receipt-2,这些是图片的 b-box 坐标 [1638,1462,2974,1462,2974,1549,1638,1549]

如果您在左侧裁剪 25 像素并在顶部裁剪 147 像素,则必须从所有 X 值和 [=15] 中减去 25 像素=] 来自 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)

顺便说一句: 你在右侧和底部裁剪了多少像素并不重要。


编辑: 重新缩放图像的计算

计算保持比例的尺寸

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 并且您可以对所有值仅计算和使用一个比例。

您必须移动多边形的坐标,与您在 xy 坐标中裁剪的数量相同。

考虑到当您应用 gray_new = gray[25:4314, 147:2880] 时,这意味着 [rows, columns],因此对于绘图,您将移除 y 轴上的前 25 个像素和前 147 个像素在 x 轴上。

结果会是

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

在值中:

bbox_coords = [[503, 825], [893, 825], [893, 925], [503, 925]]