我有一个图像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中的边界框。
如果我对您的理解正确,则希望将每个边界框的内部都设置为1,而将其余元素都设置为0。我还要假设您的数组的结构使得每一行的第一行两个坐标是特定边界框的左上角,而后两个坐标是特定边界框的右下角。
您可以做的是创建一个二进制图像,并将每个填充的边界框绘制到该二进制图像中。然后,您将获得一个包含所有边界框以及整个内部设置为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循环的最终语句中交换第一维索引和第二维索引以适合您的目的。
请特别注意,我采用了每个(x,y)坐标的floor,因为我不确定您是否将这些位置作为浮点数或整数。为了能够使用我所做的事情,您必须确保坐标是整数才能能够索引到我要制作的蒙版中。
另外,此代码不提供任何错误检查。如果您的任何边界框超出了图像边界,则MATLAB会生成错误通知您这一事实。我将留给您做其他错误检查,以在蒙版中在图像边界之外绘制边界框。如果您对此不担心,则不必编写此步骤。
我还编写了代码以在一个窗口中显示原始图像及其旁边的聚合蒙版。
祝好运!