如何计算图像中重叠块的数量

时间:2014-11-11 13:40:20

标签: matlab

我有一个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;

3 个答案:

答案 0 :(得分:1)

答案很简单。每次循环迭代将访问图像中的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为何错误的原因。

答案 1 :(得分:0)

根据我的理解,您想知道有多少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 :(得分:0)

对于1-D情况,估计重叠块总数的正确公式为:

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

如果结果不是整数,您只需占用#Of_blocks,这意味着无法使用该设置覆盖整个时间间隔。