Matlab 中的奇数边界框坐标

Odd bounding box coordinates in Matlab

我正在使用 regionprops(img,'BoundingBox'); 在图像中的某些对象周围生成边界框。边界框的坐标(xy, widthheight)总是与整数值相差 0.5。 为什么会这样?

对我来说,它造成了两个问题:

有人可以给我解释一下吗:

  1. 为什么要这样做?
  2. 在使用坐标裁剪和替换图像区域时,我应该如何使用它。我想准确地替换 imcrop 裁剪的内容并且四舍五入有点间接(简单地使用 floorceil 是行不通的,我将不得不检查图像边界这是不是问题,但对于一个相当简单的任务来说似乎有点乏味,而且是否应该像这样使用它肯定值得怀疑...)。

下面是我生成 1024x1024 图像错误的一些代码片段。

bb_coords = [124.5  979.5   27  45];   % example for bounding box generated by regionprops
subregion = imcrop(img, bb_coords);    % works fine with imcrop

% but when I want to use these coordinates for accessing the img array, 
% I generally get a warning and in this case an error.
img( bb_coords(2):(bb_coords(2)+bb_coords(4)), ...
     bb_coords(1):(bb_coords(1)+bb_coords(3))) = subregion;

MATLAB 中处理图像显示或处理的函数将像素的 中心 视为与相应的坐标网格点对齐。换句话说,对于给定尺寸的图像,第一个像素中心位于 1,第二个像素中心位于 2,依此类推,每个像素的面积将跨越坐标两侧的 +-0.5。当您绘制图像、打开轴显示并放大其中一个角时,您可以看到这一点:

img = imread('cameraman.tif');  % Load a sample image
imshow(img);                    % Display it
set(gca, 'Visible', 'on');      % Make the axes visible
axis([0 5 252 257]);            % Zoom in on the bottom left corner

documentation for regionprops 说明 'BoundingBox' 将包围整个像素区域,从而导致边界框看起来比范围宽一个像素(每边宽 0.5 个像素)中心坐标:

对于上面的 5×5 示例图像,非零像素覆盖的区域跨越前 4 行(像素中心的行坐标从 1 到 4)和右 4 列(像素的列坐标中心从 2 到 5)。因此,边界框(绿色)跨行跨度为 0.5 到 4.5(高度为 4),跨列跨度为 1.5 到 5.5(宽为 4)。

简而言之,如果要使用bb_coords中的边界框值生成图像中的索引,则需要为每个角坐标添加0.5,并且从每个宽度中减去 1:

ind_coords = bb_coords + [0.5 0.5 -1 -1];
img(ind_coords(2):(ind_coords(2)+ind_coords(4)), ...
    ind_coords(1):(ind_coords(1)+ind_coords(3))) = subregion;