首页 文章

matlab聚合图像中的边界框区域

提问于
浏览
0

我有一个图像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中所有边界框的全包边界框 . 我需要一个更精确的区域 Map 来聚合A中的边界框.
enter image description here

1 回答

  • 1

    如果我理解正确,你想找到放在一起的所有边界框的外边界,然后将整个形状的内部设置为全1.我也会假设你的数组的结构是这样的每一行,前两个坐标是左上角,而接下来的两个坐标是特定边界框的右下角 .

    你可以做的是创建一个二进制图像并将每个 filled 边界框绘制到这个二进制图像中 . 然后,您将获得一个包含所有边界框以及整个内部设置为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将生成错误,通知您这一事实 . 我会留给你做另外的错误检查,在图像边界之外的蒙版中绘制一个边界框 . 如果您不担心这一点,那么您不必编写此步骤的代码 .

    我还编写了代码来在一个窗口中显示原始图像以及旁边的聚合掩码 .

    祝好运!

相关问题