MATLAB中一个大矢量的平均误差
如何在MATLAB中精确地计算大型整数集的平均值? 我正在处理两个大向量(2672x4008维),每个向量都是图像中像素的结果。因此,结果向量将填充值0到256,即所有整数。我的问题是我想要这些灰度图像的平均强度的精确值。为了做到这一点,我使用了这条线MATLAB中一个大矢量的平均误差,matlab,average,calculation,Matlab,Average,Calculation,如何在MATLAB中精确地计算大型整数集的平均值? 我正在处理两个大向量(2672x4008维),每个向量都是图像中像素的结果。因此,结果向量将填充值0到256,即所有整数。我的问题是我想要这些灰度图像的平均强度的精确值。为了做到这一点,我使用了这条线 meanvalue = mean(I(:)) 这在MATLAB的输出行中产生了meanvalue=155.9335的值 接下来,我将向量的每个值加上20,如下所示(如果我理解正确,这将提高整个图像的强度) 然后我取这个新向量的平均值,Ipt m
meanvalue = mean(I(:))
这在MATLAB的输出行中产生了meanvalue=155.9335的值
接下来,我将向量的每个值加上20,如下所示(如果我理解正确,这将提高整个图像的强度)
然后我取这个新向量的平均值,Ipt
meanvaluept = mean(Ipt(:))
matlab给出了meanvaluept=175.8916的值。我不是数学奇才,但我知道的足够多,知道175.8916-20≠ 155.9335
无论是在数学上(如何提高MATLAB的精度),还是在程序上(MATLAB有一些内置函数可以找到强度),我们都非常感谢您的帮助。因为您指的是“灰度图像”,并且您的整数范围为0-255(您提到的256个一定是打字错误),我猜你的
I
类型是uint8
在这种情况下,MATLAB使用饱和加法,其中大于255的结果被钳制为255。您描述的效果是由这种饱和添加引起的
以下是一个例子:
>> I = uint8(randi(255,1000,1000));
>> mean( I(:)+20 )
ans =
147.1954
>> mean(I(:)) + 20
ans =
148.0151
解决方案是首先转换为双精度:
>> mean( double(I(:)) + 20 )
ans =
148.0151
你的问题中有一个非常重要的提示: 假设
I=[23;49]
meanvalue = mean(I(:)) = 4.5
当您用I添加20时,您将有:
Ipt = I + 20;
Ipt=[22 23;24 29]
因此,将I中的所有元素加上20,因此平均值将增加20。是否检查了图像数据类型 这是真的,如果你认为我的形象是
meanvalue = mean(I(:)) = 155.9335
每个像素加20
Ipt = I + 20
X20 = X + 20
= [(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (240 + 20)];
= [21 21 21; ...
21 21 21; ...
21 21 255];
X20_double = X_double + 20
= [(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (240 + 20)];
= [21 21 21; ...
21 21 21; ...
21 21 260];
你应该有
meanept = mean(Ipt(:)) = meanvalue + 20 = 175.9335
但是,不要忘记,图像的数据类型是uint8,它将像素值限制为0-255。这意味着,如果向像素添加20,其值大于255,则其值将设置为255,如果减去某个值,其值小于0,则设置为255
也许,你的一些像素限制在255,而通常你会有超过255
例如: 向量X是双精度的
X = [1 1 1; ...
1 1 1; ...
1 1 240];
X的平均值是
mean(X(:)) = 27.5556
自
( 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 240)/9 = 27.5556
如果我给每个像素加20
Ipt = I + 20
X20 = X + 20
= [(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (240 + 20)];
= [21 21 21; ...
21 21 21; ...
21 21 255];
X20_double = X_double + 20
= [(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (240 + 20)];
= [21 21 21; ...
21 21 21; ...
21 21 260];
请注意,X20(3,3)是255,而不是260。它导致
meanX20 = mean(X20(:)) = 47
但是如果我把X的数据类型改为double
X_double = double(X)
每像素加20
Ipt = I + 20
X20 = X + 20
= [(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (240 + 20)];
= [21 21 21; ...
21 21 21; ...
21 21 255];
X20_double = X_double + 20
= [(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (1 + 20); ...
(1 + 20) (1 + 20) (240 + 20)];
= [21 21 21; ...
21 21 21; ...
21 21 260];
X20_双精度的平均值为
X20_double_mean = mean(X20_double(:)) = 47.5556
看到区别了吗?
双X20的平均值为47.5556,uint8 X20的平均值为47。
我希望这会有所帮助:)“你的平均值将增加20个值”这是OP所期望的。OP问为什么不是这样。因此,你根本没有回答这个问题。这与CrisLuengo已经建议的有什么不同?