2012-08-03 4 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에 설명되어 있습니다.

하나의 이미지를 처리하는 메인 루프를 반복 할 때마다 순환 버퍼에 새 이미지를로드 한 다음 MATLABmean 내장 함수를 사용하면 평균을 효율적으로 처리 할 수 ​​있습니다.

데이터에 창 함수를 적용해야하는 경우 창 함수를 곱한 프레임의 임시 복사본을 만들고 루프 반복마다 복사본의 평균을 취합니다.

1

라인

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

는 모든 이미지를 통해 10 개 밴드 각각에 대한 Moving Average의 종류를 계산합니다. 이 줄은 이미지를 통해 meanvalue의 이동 평균을 계산합니다 : 당신은 지난 10 개 이미지를 유지하는 버퍼 구조를 추가 할 것입니다 모두 들어

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

합니다. 간단하게하기 위해 모두 메모리에 유지할 수도 있습니다.

변경이 라인 :

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]); 

당신을 표시하려면 여기를 Yout에 대한 예입니다 sth 할거야. meanvalue에 대한 유사 콘텐츠

관련 문제