2

以下に貼り付けた次のコードがあります。フィルター処理された画像のグループ全体ではなく、最後にフィルター処理された10個の画像のみを平均化するように変更したいと思います。変更する必要があると思う行は次のとおりですYout(k,p,q) = (Yout(k,p,q) + (y.^2))/2;。しかし、どうすればよいですか?

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...')
4

2 に答える 2

1

これを行うための最良の方法(私の意見では)は、画像を格納するために循環バッファを使用することです。循環バッファまたはリングバッファでは、配列内の最も古いデータ要素が、配列にプッシュされた最新の要素によって上書きされます。このような構造を作成するための基本は、Mathworksの短いビデオ「単純な循環バッファの実装」で説明されています。

単一の画像を処理するメインループの反復ごとに、新しい画像を循環バッファーにロードしてから、MATLABの組み込みmean関数を使用して平均を効率的に取得します。

データにウィンドウ関数を適用する必要がある場合は、ウィンドウ関数を掛けたフレームの一時的なコピーを作成し、ループの各反復でコピーの平均を取ります。

于 2012-08-06T10:11:24.813 に答える
1

この線

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

すべての画像の10バンドごとに一種の移動平均を計算します。この行は、画像全体の移動平均を計算meanvalueします。

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

どちらの場合も、最後の10枚の画像のみを保持するバッファ構造を追加する必要があります。簡単にするために、すべてをメモリに保持することもできます。例を次に示しYoutます。

この行を変更します:(1つのディメンションを追加します)

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

あなたはsthをします。に似ていますmeanvalue

于 2012-08-06T14:19:06.857 に答える