在 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 肯定是错字),我猜您的 Iuint8 类型.

在这种情况下,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代码实现)

学习向量量化在matlab中效果不佳

目标跟踪基于matlab Mean-shift算法目标跟踪含Matlab源码 2326期

目标跟踪基于matlab Mean-shift算法目标跟踪含Matlab源码 2326期

主成成分分析(PCA)

无监督学习——降维