如何消除能量计算中的循环?

时间:2011-03-24 23:42:22

标签: matlab image-processing

我正在制作一种从图像中提取信息的算法 - 大多数这些信息都是类似能量的数据。这基本上是通过使用内核运行图像(大小作为参数给出),并获得该内核中的平方值。

这是在三个等级中完成的,其中三个内核(补丁)大小(此时):smallestPatchSize,smallestPatchSize * 3,smallestPatchSize * 9(在第二和第三种情况下具有重叠内核)。这是为几个颜色通道,渐变滤镜等完成的(共17个)。

我的问题是,是否可以对下面的代码进行矢量化;很明显,这部分代码需要比其他代码更多的时间来运行。我是Matlab的初学者,仍然试图掌握矢量化,但这个让我感到震惊:)

for dim = 1:17

for i = 1:smallestPatchSize:(size(image,1) - currentPatchSize)
    for j = 1:smallestPatchSize:(size(image,2) - currentPatchSize)

        % calculate the position in the energy matrix
        % which has different dimensions than the input pictures
        iPosition = (i - 1 + smallestPatchSize) / smallestPatchSize;
        jPosition = (j - 1 + smallestPatchSize) / smallestPatchSize;

        % calculate the energy values and save them into the energy matrix
        energy(iPosition, jPosition, dim) = sum(sum(abs(...
            filters(i:i+currentPatchSize, j:j+currentPatchSize,dim)))) ^ 2;
    end
end
end

提前致谢 - 这是我的第一个问题@ StackOverflow:)

2 个答案:

答案 0 :(得分:3)

你正在使用本地的块值。求和滤波器是可分离的,即如果你想在m-by-n上求和,你可以将其分解为先取m-by-1,然后取结果的1-by-n求和。请注意,通过完整卷积,您可以更频繁地获取总和,但它仍然比使用blkproc或更新的blockproc更快。

因此,对于偶数smallestPatchSize,您可以将内部循环编写为:

tmp = conv2(...
            conv2(abs(filter),ones(currentPatchSize,1),'same'),...
      ones(1,currentPatchSize,'same').^2;
%# tmp contains the energy for a sliding window filter.
energy = tmp((currentPatchSize/2+1):(currentPatchSize+1):size(image,1)-(currentPatchSize/2+1),...
      (currentPatchSize/2+1):(currentPatchSize+1):size(image,2)-(currentPatchSize/2+1));

答案 1 :(得分:1)

如果您可以访问图像处理工具包,则可以使用blkproc:

B = blkproc(A,[m n],fun)

在你的情况下:

[m,n] = size(filters) ./ patchSize;
fun = @(x) sum( sum(x^2) ); % or whatever

B最终应该是合适的尺寸。如果需要,您还可以使用重叠区域。