2012-08-03 21 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