如何计算没有NaN的图像中三维矩阵的平均值?

时间:2017-10-13 13:34:15

标签: image matlab image-processing matlab-figure

我需要计算3D矩阵的平均值(代码中的最后一步)。但是,NaN计算中有许多(diff_dataframe./dataframe_vor) 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

1 个答案:

答案 0 :(得分:1)

mean2是一个快捷函数,它是图像处理工具箱的一部分,用于查找不包含处理NaN的2D区域的整个平均值。在这种情况下,只需删除NaN的所有值并找到结果平均值。请注意,删除NaN会将2D区域展开为1D向量,因此在这种情况下我们可以简单地使用mean。作为额外的检查,让我们确保没有除以0的错误,因此也要检查Inf

因此,请替换此行:

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

... with:

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);

我们首先将所需操作分配给临时变量,使用isnanisinf删除有问题的值,然后查找其余值的平均值。一个错综复杂的情况是,如果您的整个区域NaNInf,那么删除区域中的所有条目都会产生空向量,并找到其平均值未定义。单独检查以确保如果它为空,则只需指定值0即可。