如何在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的内置函数都可以找到强度),我们将不胜感激。
答案 0 :(得分:2)
由于您指的是“灰度图像”,并且您具有0-255范围内的整数(您提到的256必须是一个错字),所以我猜测您的I
的类型为{ {1}}。
在这种情况下,MATLAB使用饱和加法,将大于255的结果限制为255。您描述的效果是由该饱和加法引起的。
这里是一个例子:
uint8
解决方案是先转换为双打:
>> I = uint8(randi(255,1000,1000));
>> mean( I(:)+20 )
ans =
147.1954
>> mean(I(:)) + 20
ans =
148.0151
答案 1 :(得分:0)
您检查图像数据类型了吗?
是的,如果你的形象是我的意思,那么
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的数据类型更改为double
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
看到区别了吗? 双X20的均值为47.5556,而uint8 X20的均值为47。 我希望这会有所帮助:)
答案 2 :(得分:-2)
您的问题中有一个非常重要的说明:
假设I = [2 3;4 9]
meanvalue = mean(I(:)) = 4.5
将20与I相加时,您将拥有:
Ipt = I + 20;
Ipt = [22 23; 24 29]
因此您将I中的所有元素加20,因此您的均值将增加20。