哑巴Matlab问题

时间:2016-09-03 00:33:01

标签: matlab loops

我确信这很简单,但我很难过。我正在拍摄多组图像,每张图像都采用不同的曝光时间,并测量输出的平均值(以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。

1 个答案:

答案 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(:))