如何根据图像调整大小更改边界框位置?

How to change bounding boxes position according to image resize?

我使用 processLetter 函数将二进制图像从 [239, 397] 更改并标准化为 [128, 128],因为我发现 here。该图像包含由地面真值框包围的阿拉伯字母。当我改变大小时,我必须相应地改变边界框。我写了这段代码,但边界框没有根据原始图像进行相应调整,您可以在此处找到:

我正在努力解决这个问题,但我被卡住了并且失败了。我需要你的帮助。

此处为简单代码:

%% clean workspace
clear;
clc;
%% Read the image
im_origin = imread('C:\Users\asa\Desktop\im_origin.bmp');
% Get the original image size
[w1,h1,c1] = size(im_origin)
% function to resize the image size into [128 128]
im_resized = processLetter(im_origin);
[w2,h2,c2]= size(im_resized);
%% Read Bound box values in form [ax ay w h]
GTBoxes = [263 74   68 78;
            161 74  101 78;
            61  74  99  78];
[rowGT colGT] = size(GTBoxes);
%% Resize bounding box
% Get scale from division of height of the resized image(h2) over the 
% original image(h1)
scale = h2/h1;
BBresized = bboxresize(GTBoxes,scale);
imshow(im_resized);
hold on;
%% Draw bounding boxes around the letters
 for i=1:rowGT
  rectangle('Position',BBresized(i,:),'EdgeColor','y');
  pause(2);
 end

这是调整大小后的图像:

而且,这是调整大小后的图像以及相应的(错误的)边界框。

感谢任何帮助或建议。

这里至少有两个问题:

  1. [w1, h1, c1] = size(im_origin)错了,是[h, w, c].
  2. 您有不同的宽度和高度比例因子。

我使用简单的 imresize 和手动缩放修改了您的示例,因为我现在只有 Octave rght 用于测试(下面的代码也适用于 MATLAB Online)。 processLetter 函数似乎也从图像中裁剪了文本!?因此,您还需要确保对此进行更正(超出我的回答范围)!

% Read original image, get size
im_origin = imread('Dmkoh.png');
[h1, w1, c1] = size(im_origin)

% Set up original bounding boxes, get size
GTBoxes = [263 74  68 78;
           161 74 101 78;
            61 74  99 78]
[rowGT, colGT] = size(GTBoxes);

% Plot original image with bounding boxes
figure(1);
imshow(im_origin);
hold on;
for i = 1:rowGT
  rectangle('Position', GTBoxes(i, :), 'EdgeColor', 'y');
end
hold off;

% Resize image (using imresize here), get size
im_resized = imresize(im_origin, [128, 128]);
[h2, w2, c2] = size(im_resized)

% Resize bounding boxes (using simple scaling)
BBresized = GTBoxes;
BBresized(:, [1, 3]) = BBresized(:, [1, 3]) * w2/w1;
BBresized(:, [2, 4]) = BBresized(:, [2, 4]) * h2/h1;

% Plot resized image with bounding boxes
figure(2);
imshow(im_resized);
hold on;
for i = 1:rowGT
  rectangle('Position', BBresized(i, :), 'EdgeColor', 'y');
end
hold off;

原文:

调整大小: