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

线

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

为所有图像的 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

于 2012-08-06T14:19:06.857 回答
1

最好的方法(在我看来)是使用循环缓冲区来存储您的图像。在循环缓冲区或环形缓冲区中,数组中最旧的数据元素被推入数组的最新元素覆盖。制作这种结构的基础知识在简短的 Mathworks 视频实现一个简单的循环缓冲区中进行了描述。

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

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

于 2012-08-06T10:11:24.813 回答