2012-08-03 81 views
2

我有下面的代码,粘贴在下面。我想将其更改为仅平均10个最近过滤的图像,而不是整组过滤图像。我认为我需要改变的路线是:Yout(k,p,q) = (Yout(k,p,q) + (y.^2))/2;,但我该怎么做?使用MATLAB进行平均的滚动窗口

j=1; 
K = 1:3600; 
window = zeros(1,10); 
Yout = zeros(10,column,row); 
figure; 
y = 0;       %# Preallocate memory for output 
%Load one image 
for i = 1:length(K) 
    disp(i) 
    str = int2str(i); 
    str1 = strcat(str,'.mat'); 
    load(str1); 
    D{i}(:,:) = A(:,:); 

    %Go through the columns and rows 
    for p = 1:column 
     for q = 1:row 
      if(mean2(D{i}(p,q))==0) 
       x = 0; 
      else 
       if(i == 1) 
        meanvalue = mean2(D{i}(p,q)); 
       end 

       %Calculate the temporal mean value based on previous ones. 
       meanvalue = (meanvalue+D{i}(p,q))/2; 
       x = double(D{i}(p,q)/meanvalue); 
      end 
      %Filtering for 10 bands, based on the previous state 
      for k = 1:10 
       [y, ZState{k}] = filter(bCoeff{k},aCoeff{k},x,ZState{k}); 
       Yout(k,p,q) = (Yout(k,p,q) + (y.^2))/2; 
      end 
     end 
    end 
    %  for k = 2:10 
    %   subplot(5,2,k) 
    %   subimage(Yout(k)*5000, [0 100]); 
    %   colormap jet 
    %  end 
    %  pause(0.01); 
end 
disp('Done Loading...') 

回答

1

要做到这一点(在我看来)的最佳方法是使用循环缓冲区来存储图像。在循环缓冲区或环形缓冲区中,数组中最老的数据元素被推入数组的最新元素覆盖。制作这种结构的基础知识在简短的Mathworks视频Implementing a simple circular buffer中描述。

对于处理单个图像的主循环的每个迭代,只需将一个新图像加载到循环缓冲区中,然后使用的内置函数mean函数有效地取平均值。

如果您需要对数据应用窗口函数,则将窗口函数乘以窗口函数的临时副本并在循环的每次迭代中取平均值。

1

线

Yout(k,p,q) = (Yout(k,p,q) + (y.^2))/2; 

计算的一种Moving Average为每10个波段在所有的图片。 这条线在你的图像计算meanvalue移动平均线:

meanvalue=(meanvalue+D{i}(p,q))/2; 

对于这两个,你会想补充一点,仅保存最后10幅图像的缓冲结构。 为了简化它,您还可以将所有内容都保存在内存中。下面是Yout一个例子:

改变这一行:(加入一维)

Yout = zeros(3600,10,column,row); 

而改变这一点:

for q = 1:row    

    [...] 

    %filtering for 10 bands, based on the previous state 
    for k = 1:10 
     [y, ZState{k}] = filter(bCoeff{k},aCoeff{k},x,ZState{k}); 
     Yout(i,k,p,q) = y.^2; 
    end 

    YoutAvg = zeros(10,column,row); 
    start = max(0, i-10+1); 
    for avgImg = start:i 
     YoutAvg(k,p,q) = (YoutAvg(k,p,q) + Yout(avgImg,k,p,q))/2; 
    end 
end 

然后显示使用

subimage(Yout(k)*5000, [0 100]); 

你会做某事。 meanvalue