我确信这很简单,但我很难过。我正在拍摄多组图像,每张图像都采用不同的曝光时间,并测量输出的平均值(以DN为单位)和信号的RMS。重点是构建光子传递曲线。我遇到的问题是,当我尝试平均窗口的信号或RMS,甚至是单个像素时,存储的值是可笑的不同。这应该是相当直接的,这就是为什么它如此令人沮丧。任何见解将不胜感激。
这是我的代码:
stacklength = 25;
frame = [];
frameMean = [];
framerms = [];
frameRMS = [];
t = 1;
stacknum = 99;
stackdepth = 15;
imagewidth=1944;
imageheight=2592;
uStart = 1001;
uEnd = 1001;
vStart = 1001;
vEnd = 1001;
tic;
for i=1:stacklength
filename=sprintf('PTLstack_%d.mat' ,i); %name files one at a time
load(filename);
for u = uStart:uEnd
for v = vStart:vEnd
pix = double(squeeze(pixel(u,v,:)));
pixmean = mean(pix);
pixrms = rms(pix);
frame(t) = pixmean;
framerms(t) = abs(pixrms-pixmean);
t = t+1;
end
end
frameMean(i) = mean(frame);
frameRMS(i) = mean(framerms);
t = 1;
disp(i);
end
toc;
以下是我为它展示的几个值:
pix
16
18
21
19
22
17
19
18
16
20
18
21
23
17
20
pixmean
19
pixrms
frame(t)
19
framerms(t)
18.8880
mean(frame)
0.4404
frameMean(i)
0.4404
**********
frameRMS(i)
0.4404
**********
如果您想澄清任何此类问题,请与我们联系。我知道查看一大块代码并期望弄清楚其中发生的一切可能很烦人。
感谢10 ^ 6。
答案 0 :(得分:1)
结果表明你的frame
变量中有一些零点,降低了平均值。对我来说,究竟在哪里进入并不清楚,部分原因是这是一种不太Matlab风格的处理这种代码的方式。
解决这个问题的一个捷径,虽然不优雅,但是要告诉它只采用非零的均值:
frameMean(i) = mean(frame(frame~=0));
但是,如果您有备用零,那么您可能还有其他类型的虚假数据。
更好的解决方案是完全摆脱这些循环和增量变量等。假设您的图像被加载为大小为(x,y,15)的图像堆栈,您可以在一次访问中获取所需区域的均值和rms:
pix = pix(ustart:uend,vstart:vend,:); % take window area of choice
frame = mean(pix,3); % make mean
framerms = rms(pix,3);
framerms = abs(framerms-frame);
这里的输出是帧中的2D矩阵;在整个框架中取平均值最简单的方法是使用:索引所有元素,例如: mean(frame(:))
。