簡體   English   中英

裁剪圖像后,如何找到新的邊界框坐標?

[英]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 ,這些是圖像[1638,1462,2974,1462,2974,1549,1638,1549]的 b 框坐標。

如果您在左側裁剪了25 147像素,在頂部裁剪了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並且您可以計算所有值並僅使用一個比例。

您必須移動多邊形的坐標,與您在xy坐標中裁剪的數量相同。

考慮到當您應用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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM