Matlab 中的奇数边界框坐标
Odd bounding box coordinates in Matlab
我正在使用 regionprops(img,'BoundingBox');
在图像中的某些对象周围生成边界框。边界框的坐标(x
、y,
width
、height
)总是与整数值相差 0.5。
为什么会这样?
对我来说,它造成了两个问题:
- 当使用这些坐标访问图像数组时,我收到警告:
Warning: Integer operands are required for colon operator when used as index
。我可以接受,分别用 floor
或 ceil
删除它,但是 ...
- ...当这些坐标靠近图像边界时,它们会导致
错误,因为值 0.5 和 1024.5 与图像不匹配
边界 1 和 1024。我得到
Subscripted assignment dimension mismatch.
或 Index exceed matrix dimensions.
,这是合理的。
有人可以给我解释一下吗:
- 为什么要这样做?
- 在使用坐标裁剪和替换图像区域时,我应该如何使用它。我想准确地替换
imcrop
裁剪的内容并且四舍五入有点间接(简单地使用 floor
或 ceil
是行不通的,我将不得不检查图像边界这是不是问题,但对于一个相当简单的任务来说似乎有点乏味,而且是否应该像这样使用它肯定值得怀疑...)。
下面是我生成 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;
我正在使用 regionprops(img,'BoundingBox');
在图像中的某些对象周围生成边界框。边界框的坐标(x
、y,
width
、height
)总是与整数值相差 0.5。
为什么会这样?
对我来说,它造成了两个问题:
- 当使用这些坐标访问图像数组时,我收到警告:
Warning: Integer operands are required for colon operator when used as index
。我可以接受,分别用floor
或ceil
删除它,但是 ... - ...当这些坐标靠近图像边界时,它们会导致
错误,因为值 0.5 和 1024.5 与图像不匹配
边界 1 和 1024。我得到
Subscripted assignment dimension mismatch.
或Index exceed matrix dimensions.
,这是合理的。
有人可以给我解释一下吗:
- 为什么要这样做?
- 在使用坐标裁剪和替换图像区域时,我应该如何使用它。我想准确地替换
imcrop
裁剪的内容并且四舍五入有点间接(简单地使用floor
或ceil
是行不通的,我将不得不检查图像边界这是不是问题,但对于一个相当简单的任务来说似乎有点乏味,而且是否应该像这样使用它肯定值得怀疑...)。
下面是我生成 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;