我有一个图像I,矩阵A中有一组边界框位置,A = [x10 y10 x11 y11; x20 y20 x21 y21 ... xn0 yn0 xn1 yn1]。这些盒子可以在图像上可视化,如下所示。
imshow(I);
numparts = floor(size(A, 2)/4);
for i = 1:numparts
x1 = A(1,1+(i-1)*4);
y1 = A(1,2+(i-1)*4);
x2 = A(1,3+(i-1)*4);
y2 = A(1,4+(i-1)*4);
line([x1 x1 x2 x2 x1]',[y1 y2 y2 y1 y1]','color',colorset{i},'linewidth',2);
end
如何聚合这些边界框区域,以便这些框中的像素标记为1,否则标记为0?我不想要一个包含A的所有边界框的全包边界框。我需要一个更精确的区域地图来聚合A中的边界框。
答案 0 :(得分:1)
如果我理解正确,你想找到放在一起的所有边界框的外围,然后将整个形状内部设置为全1.我也会假设你的阵列结构使得对于每一行,前两个坐标是左上角,而接下来的两个坐标是特定边界框的右下角。
您可以做的是创建二进制图像并将每个填充边界框绘制到此二进制图像中。然后,您将获得一个包含所有边界框以及整个内部设置为1的形状。因此,请执行以下操作:
%// Declare mask
mask = false(size(I,1), size(I,2));
%// Go through each bounding box pair of co-ordinates and draw a bounding box
%// inside the mask
%// Directly using your code... though you can do this more efficiently
numparts = floor(size(A, 2)/4);
for i = 1:numparts
x1 = floor(A(1,1+(i-1)*4));
y1 = floor(A(1,2+(i-1)*4));
x2 = floor(A(1,3+(i-1)*4));
y2 = floor(A(1,4+(i-1)*4));
%// Draw bounding box here
mask(y1:y2,x1:x2) = true;
end
%// Show the original image as well as the mask beside it
figure;
subplot(1,2,1);
imshow(I);
subplot(1,2,2);
imshow(final_mask);
final_mask
现在应该包含您正在寻找的内容。我在这里的假设是x
是水平的,而y
是垂直的。如果不是这种情况,那么只需在for
循环的最终语句中交换第一维和第二维索引,以满足您的目的。
请特别注意,我采用了每个floor
坐标的(x,y)
,因为我不确定您是否将这些位置设为浮点或整数。为了能够使用我所做的,你必须确保坐标是整数,以便能够索引到我试图制作的面具中。
此外,此代码不提供任何错误检查。如果您的任何边界框超出图像边界,MATLAB将生成错误,通知您这一事实。我将让您在绘制图像边界之外的蒙版中的边界框时执行其他错误检查。如果您不担心这一点,那么您就不必为此步骤编写代码。
我还编写了代码,在一个窗口中显示原始图像以及旁边的聚合掩码。
祝你好运!