裁剪图像后,如何找到新的边界框坐标?
Posted
技术标签:
【中文标题】裁剪图像后,如何找到新的边界框坐标?【英文标题】:After cropping a image, how to find new bounding box coordinates? 【发布时间】:2020-04-26 08:48:03 【问题描述】:这是我使用 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
,这些是图片[1638,1462,2974,1462,2974,1549,1638,1549]
的 b-box 坐标。
【问题讨论】:
如果您在左侧裁剪了 25 个像素,则从所有X
值中减去 25 个像素。与***作物和Y
值类似。
@furas 我已经裁剪了25:4314
那么右侧的 4314 呢?
右下角裁剪多少像素并不重要。
【参考方案1】:
如果您裁剪了左侧的25
像素和顶部的147
像素,那么您必须从所有X
值中减去25
像素,并从Y
值中减去147
像素
因为图像上的所有元素都向左移动了 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
,您可以计算所有值并仅使用一个比例。
【讨论】:
谢谢 :) ..实际上对我来说,x-147 和 y-25 给了我正确的边界框,如下面的答案。我做错了吗? 我还有一个类似的疑问,在这里我手动裁剪了结果,但在我的项目中,我也在调整图像的大小,如resize(original_img, shape=(550, 270))
这里调整大小函数自动将(4376, 2885)
转换为@ 987654334@那我怎样才能找到新的边界框值?
第一:你不保持纵横比(4376/2885, 550/270)
给(1.5, 2.0)
所以你变形了页面。它应该有高度550/(4376/2885)
,它给出362
。第二:你必须计算比例scale_x = 4376/550
,scale_y = 2885/270
(给出sx=7.95, sy=10.68
),然后将所有X
除以scale_x
,将所有Y
除以scale_y
。
我添加了计算来回答。
我尝试了解决方案,但它给了我错误的边界框。【参考方案2】:
您必须移动多边形的坐标,与您在x
和y
坐标中裁剪的数量相同。
考虑到当您应用gray_new = gray[25:4314, 147:2880]
时,这意味着[rows, columns]
,因此对于绘图,您将删除y
轴上的前25 个像素和x
轴上的前147 个像素。
结果是
bbox_coords = [[x - 147, y-25] for x, y in bbox_coords]
在价值观中:
bbox_coords = [[503, 825], [893, 825], [893, 925], [503, 925]]
【讨论】:
以上是关于裁剪图像后,如何找到新的边界框坐标?的主要内容,如果未能解决你的问题,请参考以下文章