Image 如何计算没有NaN的图像中3D矩阵的平均值?

Image 如何计算没有NaN的图像中3D矩阵的平均值?,image,matlab,image-processing,matlab-figure,Image,Matlab,Image Processing,Matlab Figure,我需要计算3D矩阵的平均值(代码的最后一步)。但是,在(diff\u dataframe./dataframe\u vor)计算中有许多NaNs。因此,当我使用此代码时,一些结果将是NaN。我如何通过忽略NAN来计算该矩阵的平均值?我附上代码如下 S.amplitude = 1:20;%:20; S.blocksize = [1 2 3 4 5 6 8 10 12 15 20]; S.frameWidth = 1920; S.frameHeight = 1080; S.quality=0:10:

我需要计算3D矩阵的平均值(代码的最后一步)。但是,在
(diff\u dataframe./dataframe\u vor)
计算中有许多
NaN
s。因此,当我使用此代码时,一些结果将是
NaN
。我如何通过忽略NAN来计算该矩阵的平均值?我附上代码如下

S.amplitude = 1:20;%:20;
S.blocksize = [1 2 3 4 5 6 8 10 12 15 20];
S.frameWidth = 1920;
S.frameHeight = 1080;
S.quality=0:10:100;
image = 127*ones(S.frameHeight,S.frameWidth,3);
S.yuv2rgb = [1 0 1.28033; 1 -0.21482 -0.38059; 1 2.12798 0];
i_bs = 0;
for BS = S.blocksize
i_bs = i_bs + 1;

hblocks = S.frameWidth / BS;
vblocks = S.frameHeight / BS;
i_a = 0;
dataU = randi([0 1],vblocks,hblocks);
dataV = randi([0 1],vblocks,hblocks);
dataframe_yuv = zeros(S.frameHeight, S.frameWidth, 3);
for x = 1 : hblocks
    for y = 1 : vblocks
        dataframe_yuv((y-1)*BS+1:y*BS, ...
            (x-1)*BS+1:x*BS, 2) = dataU(y,x) * 2 - 1;
        dataframe_yuv((y-1)*BS+1:y*BS, ...
            (x-1)*BS+1:x*BS, 3) = dataV(y,x) * 2 - 1;
    end
end

dataframe_rgb(:,:,1) = S.yuv2rgb(1,1) * dataframe_yuv(:,:,1) + ...
    S.yuv2rgb(1,2) * dataframe_yuv(:,:,2) + ...
    S.yuv2rgb(1,3) * dataframe_yuv(:,:,3);
dataframe_rgb(:,:,2) = S.yuv2rgb(2,1) * dataframe_yuv(:,:,1) + ...
    S.yuv2rgb(2,2) * dataframe_yuv(:,:,2) + ...
    S.yuv2rgb(2,3) * dataframe_yuv(:,:,3);
dataframe_rgb(:,:,3) = S.yuv2rgb(3,1) * dataframe_yuv(:,:,1) + ...
    S.yuv2rgb(3,2) * dataframe_yuv(:,:,2) + ...
    S.yuv2rgb(3,3) * dataframe_yuv(:,:,3);
for A = S.amplitude
    i_a = i_a + 1;
    i_q = 0;
image1p = round(image + dataframe_rgb * A);
image1n = round(image - dataframe_rgb * A);
dataframe_vor = ((image1p-image1n)/2)/255;
for Q = S.quality
        i_q = i_q + 1;
namestrp = ['greyjpegs/Img_BS' num2str(BS) '_A' num2str(A) '_Q'     num2str(Q) '_1p.jpg'];
namestrn = ['greyjpegs/Img_BS' num2str(BS) '_A' num2str(A) '_Q' num2str(Q) '_1n.jpg'];
imwrite(image1p/255,namestrp,'jpg', 'Quality', Q);
imwrite(image1n/255,namestrn,'jpg', 'Quality', Q);
error_mean(i_bs, i_a, i_q) = mean2((abs(diff_dataframe./dataframe_vor)));
end
end
end
是图像处理工具箱中的一个快捷方式函数,用于查找二维区域的整个平均值,该平均值不包括处理
NaN
。在这种情况下,只需删除
NaN
的所有值,并找到结果的平均值。请注意,删除
NaN
会将2D区域展开为1D向量,因此在这种情况下,我们可以简单地使用
mean
。作为额外的检查,让我们确保没有被0除的错误,因此还要检查
Inf

因此,请更换该行:

error_mean(i_bs, i_a, i_q) = mean2((abs(diff_dataframe./dataframe_vor)));
。。。与:

tmp = abs(diff_dataframe ./ dataframe_vor);
mask = ~isnan(tmp) | ~isinf(tmp);
tmp = tmp(mask);

if isempty(tmp)
    error_mean(i_bs, i_a, i_q) = 0;
else
    error_mean(i_bs, i_a, i_q) = mean(tmp);

我们首先将所需的操作分配给一个临时变量,使用和删除不符合要求的值,然后找到其余值的平均值。一个复杂的情况是,如果整个区域
NaN
Inf
,则删除该区域中的所有这些条目将导致空向量,并找到该未定义的平均值。这里有一个单独的检查,以确保如果它为空,只需将值指定为0即可。

感谢您的帮助。我尝试了这段代码,但一些NaN在使用后变成了Inf:
tmp=abs(diff\u dataframe./dataframe\u vor);tmp=tmp(~isnan(tmp));如果isempty(tmp)误差_均值(i_bs,i_a,i_q)=0;else误差_平均值(i_bs,i_a,i_q)=平均值(tmp)
这是因为分母也可能是
0
。我会相应地改变。再次感谢你的帮助。很抱歉迟了答复。我再次尝试了这段代码,现在结果中不再有NaN或Inf。但我对结果有个疑问。因为我们删除了
mask
中的
NaN
Inf
,并在相应位置分配了
0
的值。当我们计算平均值时,实际上我们只想计算所有非零元素的平均值。对于实验(3+0+2)/3和(3+2)/2,结果会不同,这是
误差平均值(i_bs,i_a,i_q)=平均值(tmp)精确地针对所有非零元素的平均值?谢谢大家!@YingWang是的,这处理了查找所有非零元素的平均值的情况。只有当每个窗口中的所有元素都是
Inf
NaN
时,我们才将0指定为平均值。明白了,谢谢您的帮助。