滚动窗口使用MATLAB进行平均

时间:2012-08-03 16:15:28

标签: matlab image-processing

我有以下代码,粘贴在下面。我想将其更改为仅平均最近过滤的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...')

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法(在我看来)是使用循环缓冲区来存储图像。在循环缓冲区或环形缓冲区中,阵列中最旧的数据元素将被推入阵列的最新元素覆盖。制作此类结构的基础知识在简短的Mathworks视频 Implementing a simple circular buffer 中进行了描述。

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

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

答案 1 :(得分:1)

该行

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

为所有图片中的10个波段中的每个波段计算一种Moving Average。 此行计算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