如何在matlab中加速图像的滑动window函数

How to speed up the sliding window function in matlab for an image

我有一个图像,我必须在其上滑动 81*81 window 以便找到中心像素与周围 81*81 [= 中存在的每个像素之间的强度距离(差异) 15=],我还必须找出中心像素坐标与周围 window 像素坐标之间的位置距离 i.e.the 差异。如果我使用 for 循环,那么我将不得不为这个操作使用 4 个嵌套的 for 循环,这几乎需要一整天的时间来处理一张图像。我想为图像中存在的每个像素存储 81 * 81 强度差异,同样为位置距离存储,这往往会创建一个 4D 变量。任何人都可以建议我一些有效的方法来做到这一点。以下是我编写此代码的方式:

I = imread('House.tiff');
YCbCr = rgb2ycbcr(I);
YCbCr = double(YCbCr);
YCbCr = imresize(YCbCr,[200 200]);
[m n v] = size(YCbCr);
Y = YCbCr(:,:,1); Cb = YCbCr(:,:,2);  Cr =YCbCr(:,:,3);
Y1 = padarray(Y,[20,20]);
Cb1 = padarray(Cb,[20,20]); 
Cr1 = padarray(Cr,[20,20]); 
window_size = 41;
p = (window_size-1)/2;
Dl = zeros(m,n,41,41);  Df = zeros(m,n,41,41);
for x = 1:1:m
    for y = 1:1:n
        for a = -p:1:p
            for b = -p:1:p
 Df(x,y,a+p+1,b+p+1)= abs(Y(x,y)-Y1(x+a+p,y+b+p))+ abs(Cb(x,y)- Cb1(x+a+p,y+b+p))+ abs(Cr(x,y)- Cr1(x+a+p,y+b+p));%% intensity distance
Dl(x,y,a+p+1,b+p+1) = max(abs((x+p)-(x+a+p)),abs((y+p)-(y+b+p)));%% location distance
            end
        end
    end
end

对于那个 81 x 81 滑动 window,您可能有一个 X 和 Y "initial" 点。 假设,创建一个新的临时 window 在 80x80 window.

中的那些质心之间裁剪初始图像
new_image = image(X-40:X+40,Y-40:Y+40);

这将快速为您创建新的临时图像。

一路存储像素值

for i=1:length(images)
currentImage=image(i,1);
new_image(i)=currentImage(X-40:X+40,Y-40:Y+40);
end

a) 您的位置差异矩阵始终相同 - 它不依赖于 Y。只需为其创建一个 81x81 实例即可。

b) 为什么需要存储所有这些输出?花费大量时间很容易是因为如此大的矩阵使用 RAM,这意味着您正在读写 to/from 磁盘(页面文件)而不是 RAM,这会大大降低速度。最好在该算法的 "next stage" 处进行优化,减少对该矩阵实际操作的计算。根据您的下一阶段,使用 imfilter 可能是正确的选择。