如何根据图像调整大小更改边界框位置?
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
这是调整大小后的图像:
而且,这是调整大小后的图像以及相应的(错误的)边界框。
感谢任何帮助或建议。
这里至少有两个问题:
[w1, h1, c1] = size(im_origin)
错了,是[h, w, c]
.
- 您有不同的宽度和高度比例因子。
我使用简单的 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;
原文:
调整大小:
我使用 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
这是调整大小后的图像:
而且,这是调整大小后的图像以及相应的(错误的)边界框。
感谢任何帮助或建议。
这里至少有两个问题:
[w1, h1, c1] = size(im_origin)
错了,是[h, w, c]
.- 您有不同的宽度和高度比例因子。
我使用简单的 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;
原文:
调整大小: