【问题标题】:How to count the number of overlapping blocks in an Image如何计算图像中重叠块的数量
【发布时间】:2014-11-11 13:40:20
【问题描述】:

我有一个 512X512 大小的图像,我为整个图像制作了 4x4 重叠块。如何计算重叠块的数量并将其保存在 matlab 的数组中。 对于 4x4 重叠块,我已经完成了如下操作。现在如何计算块的数量并使用数组存储它。

[e f] = size(outImg);
l=0;
for i=2:e-2
    for j=2:f-2
        H =double(outImg((i-1:i+2),(j-1:j+2)));
        eval(['out_' num2str(l) '=H']);
        l=l+1
    end;
end;

【问题讨论】:

  • 你能举一个输入和预期输出的例子吗?
  • 我已经编辑了代码。如果您将代码应用到任何图像上,您可以在命令窗口中找到关于如何为整个图像形成 4x4 非重叠块的信息。
  • 为什么要统计它们?您可以计算块的数量。你想如何存储它们?我的第一个猜测是:创建一个大小为 e-3 X f-3 x 4 的 3D 矩阵并将值存储在第三维中?
  • 是的,我想计算块数并存储它
  • 本次运行结束时,l的块数是多少?

标签: matlab


【解决方案1】:

根据我对问题的理解,您想知道图像中可以容纳多少个 4x4 块,然后存储它们。

计算块的数量是微不足道的,在您提供的示例代码中,l 是计算的元素数量。当然,它的值是确定性的(由fe 确定)。无需遍历它们即可获得计数值。

count = (f-3)*(e-3);

如果要将值保存在数组中(假设您在这里指的是矩阵而不是元胞数组),您需要决定如何表示它,您可以将其存储为 4D e-3 x f-3 x 4 x 4 矩阵(如 @ Steffen 建议),或者作为 3D 4 x 4 x count 矩阵,我认为后者更直观。在任何情况下,您都应该提前为矩阵分配内存,而不是即时分配:

[e f] = size(outImg);
count = (f-3)*(e-3);
outMat = zeros(4,4,count); % assign the memory for the matrix
l = 0;
for i=2:e-2
    for j=2:f-2
        l = l + 1;
        outMat(:,:,l) = double(outImg((i-1:i+2),(j-1:j+2)));
    end;
end;

块的数量存储为countl,但提前计算count可以提前分配所需的内存,i块存储为outMat(:,:,i)

使用 4D 矩阵的实现是:

[e f] = size(outImg);
count = (f-3)*(e-3);
outMat = zeros((f-3),(e-3),4,4); % assign the memory for the matrix
for i=2:e-2
    for j=2:f-2
        outMat(i,j,:,:) = double(outImg((i-1:i+2),(j-1:j+2)));
    end;
end;

在这种情况下,不需要l,每个块(索引为ij)都位于outMat(i,j,:,:)

关于元胞数组与矩阵,由于矩阵需要在内存中的连续位置,您可能需要考虑使用元胞数组而不是矩阵。一个 512x512x4 的双精度矩阵需要(假设 8 字节表示)8MB (512*512*8*4 = 8*1024*1024)。如果尺寸更大,或者如果您被(连续)内存束缚,则单元阵列可能是更好的解决方案。你可以在Difference between cell and matrix in matlab?阅读更多关于差异的信息。

实现会非常相似。

[e f] = size(outImg);
count = (f-3)*(e-3);
outArray = cell(1,count);
l = 0;
for i=2:e-2
    for j=2:f-2
        l = l + 1;
        outArray{1,l} = double(outImg((i-1:i+2),(j-1:j+2)));
    end;
end;

【讨论】:

    【解决方案2】:

    答案很简单。每次循环迭代将访问图像中的 1 个重叠块。您所要做的就是计算循环迭代的次数,即((e-2) - 2 + 1) x ((f - 2) - 2 + 1) = (e - 3) x (f - 3)。无需保留循环迭代变量。


    小提示。除非绝对必要,否则在任何情况下都不应使用eval。 MATLAB 之神将迅速打击任何违规者。为l 的每个增量分配一个新变量的代码绝对没有必要。如果您有 10000 个重叠块,您将有 10000 个变量。你可以简单地看看最后的l,它会告诉你有多少重叠的块。

    删除该行代码。我们讨厌它。它烧毁了我们。


    请参阅 this post by Loren Shure for more details,了解为什么使用 eval 不好。

    【讨论】:

    • 非常感谢大家。
    【解决方案3】:

    对于一维情况,估计重叠块总数的正确公式是:

    (#Of_blocks) = (#Image_width - #Block_width) / (#Block_width - #Block_overlap) + 1

    如果结果不是整数,您只需取#Of_blocks 的下限,这意味着使用该设置无法覆盖整个区间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多