在 MATLAB 中平均大向量的误差
Posted
技术标签:
【中文标题】在 MATLAB 中平均大向量的误差【英文标题】:Error of Averaging a Large Vector in MATLAB 【发布时间】:2018-06-29 19:41:24 【问题描述】:如何在 MATLAB 中准确地取大量整数的平均值? 我正在处理两个大向量(尺寸为 2672x4008),每个向量都是图像中像素的结果。因此,结果向量填充了 0 到 256 的值,所有整数。我的问题是我想要这些灰度图像的平均强度的准确值。为此,我使用了这条线
meanvalue = mean(I(:))
这在 MATLAB 的输出行中产生了平均值 = 155.9335。
接下来,我为向量的每个值添加了 20,如下所示(如果我理解正确,这应该会提高整个图像的强度)。
Ipt = I + 20;
然后我取这个新向量的平均值,Ipt
meanvaluept = mean(Ipt(:))
然后 matlab 吐出一个 meanvaluept = 175.8916 的值。我不是数学天才,但我知道175.8916 - 20 ≠ 155.9335。
任何帮助都将不胜感激,无论是数学上(如何提高 MATLAB 的精度),还是程序上(MATLAB 的一些内置函数可以找到强度)。
【问题讨论】:
【参考方案1】:由于您指的是“灰度图像”,并且您的整数范围为 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
【讨论】:
【参考方案2】:您检查过图像数据类型吗?
确实,如果你的图像 I 的平均值是
meanvalue = mean(I(:)) = 155.9335
你给每个像素加了 20
Ipt = I + 20
你应该有
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
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(3,3) 是 255,而不是 260。它导致
meanX20 = mean(X20(:)) = 47
但如果我将 X 的数据类型更改为双精度
X_double = double(X)
每个像素加20
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_double 的平均值是
X20_double_mean = mean(X20_double(:)) = 47.5556
看到区别了吗? double X20 的平均值是 47.5556,uint8 X20 的平均值是 47。 我希望这会有所帮助:)
【讨论】:
这与 CrisLuengo 已经建议的有何不同?【参考方案3】:您的问题中有一个非常重要的说明:
假设I = [2 3;4 9]
meanvalue = mean(I(:)) = 4.5
当你用 I 加 20 时,你将拥有:
Ipt = I + 20;
Ipt = [22 23;24 29]
所以你将 20 添加到 I 中的所有元素,因此你的平均值将增加 20 值。
【讨论】:
“你的平均值将增加 20 值”这是 OP 所期望的。 OP问为什么不是这样。因此,您根本没有回答问题。以上是关于在 MATLAB 中平均大向量的误差的主要内容,如果未能解决你的问题,请参考以下文章
目标跟踪基于matlab Mean-shift算法目标跟踪含Matlab源码 2326期