我正在制作一种从图像中提取信息的算法 - 大多数这些信息都是类似能量的数据。这基本上是通过使用内核运行图像(大小作为参数给出),并获得该内核中的平方值。
这是在三个等级中完成的,其中三个内核(补丁)大小(此时):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:)
答案 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最终应该是合适的尺寸。如果需要,您还可以使用重叠区域。