我想计算一个给定的轴的方向上的最大翻译图像。我知道ordfilt2,但是我想避免使用图像处理工具箱。
这是我目前掌握的代码:

imInput = imread('tire.tif');
n = 10;

imMax = imInput(:, n:end);
for i = 1:(n-1)
    imMax = max(imMax, imInput(:, i:end-(n-i)));
end

为了加快计算速度,可以避免使用for循环吗?如果可以,如何避免?
第一次编辑:对im2col使用Octave的代码实际上要慢50%。
第二次编辑:预分配似乎没有足够改善结果。
sz = [size(imInput,1), size(imInput,2)-n+1];

range_j = 1:size(imInput, 2)-sz(2)+1;
range_i = 1:size(imInput, 1)-sz(1)+1;

B = zeros(prod(sz), length(range_j)*length(range_i));

counter = 0;
for j = range_j % left to right
    for i = range_i % up to bottom
        counter = counter + 1;
        v = imInput(i:i+sz(1)-1, j:j+sz(2)-1);
        B(:, counter) = v(:);
    end
end

imMax = reshape(max(B, [], 2), sz);

第三次编辑:我将显示时间。

最佳答案

看看这个问题的答案,关于在c中做一个滚动中值,我已经成功地把它变成了一个mex函数,它比ordfilt2还要快做一个最大值需要一些工作,但我相信这是可能的。
Rolling median in C - Turlach implementation

10-01 19:18