Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中一个大矢量的平均误差_Matlab_Average_Calculation - Fatal编程技术网

MATLAB中一个大矢量的平均误差

MATLAB中一个大矢量的平均误差,matlab,average,calculation,Matlab,Average,Calculation,如何在MATLAB中精确地计算大型整数集的平均值? 我正在处理两个大向量(2672x4008维),每个向量都是图像中像素的结果。因此,结果向量将填充值0到256,即所有整数。我的问题是我想要这些灰度图像的平均强度的精确值。为了做到这一点,我使用了这条线 meanvalue = mean(I(:)) 这在MATLAB的输出行中产生了meanvalue=155.9335的值 接下来,我将向量的每个值加上20,如下所示(如果我理解正确,这将提高整个图像的强度) 然后我取这个新向量的平均值,Ipt m

如何在MATLAB中精确地计算大型整数集的平均值? 我正在处理两个大向量(2672x4008维),每个向量都是图像中像素的结果。因此,结果向量将填充值0到256,即所有整数。我的问题是我想要这些灰度图像的平均强度的精确值。为了做到这一点,我使用了这条线

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已经建议的有什么不同?