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