为什么首选输入图像类为double?

时间:2013-12-24 17:12:46

标签: matlab image-processing

我正在阅读使用matlab的数字图像处理,并且有一个例子,输入图像将受到一些强度转换,如伽玛变换,对比度拉伸,负面等。

这是作者对图像所做的第一件事:

% If the input is of class double, and it is outside the range
% [0, 1], and the specified transformation is not 'log', convert the
% input to the range [0, 1].
if strcmp(class(f), 'double') & max(f(:)) > 1 & . . .
-strcmp(varargin{1}, 'log')
f = mat2gray(f);
else % Convert to double, regardless of class(f).
f = im2double(f);

我是图像处理的新手,而我没有得到的是为什么所有这些变化?为什么我们不能直接拍摄输入图像(例如unint16)并将伽玛和负函数应用于它?为什么必须是double[0 1]之间?

3 个答案:

答案 0 :(得分:4)

gamma correction经常使输入和输出保持在[0,1]范围内,Vin^gamma = Vout满足此范围要求,无论gamma>1还是{{1} }

对于各种操作,双格式可能更容易。我不知道您提供的代码中的详细信息,但根据我的经验,有时像gamma<1这样的阈值处理方法会返回错误:a.*(a>100)如果Integers can only be combined with integers of the same class, or scalar doublesa类型。 uint16格式可能会遇到溢出问题。

答案 1 :(得分:2)

Matlab中的许多内置函数都希望数组为double - 它们可能会检查数据类型,如果不是,则会失败。简单示例 - 如果您想要所有像素值的总和,保持uint16中的数据将很快导致(可能是静默的)溢出。你不希望这种情况发生。

虽然uint16是用于存储数据的紧凑格式,但double是执行各种计算的更好类型,而不必担心这些事情。

至于将图像转换为范围[0,1] - 这意味着图像表示例程不需要进一步缩放(许多例程期望值介于0 - 黑色和1 - 白色之间(或“完全红,绿,蓝”。

答案 2 :(得分:2)

除了在其他答案中已经陈述的内容之外,还有一个更紧迫的原因:在Matlab中,许多操作未定义(1),或表现不同 (2),关于整数类型

  1. 未定义:尝试此伽马校正:uint16(100)^2.2:您将收到错误Integers can only be raised to positive integral powers.您需要转换为double

  2. 表现不同:假设您想在伽马校正之前将图像single标准化为范围[0,1]。你会做f之类的事情。但这只会给您f/intmax('uint16')0个值!这是因为整数除法返回一个整数(忽略余数),1中的任何值都小于或等于f。因此,您应首先转换为intmax('uint16')(或double)以获得预期结果(实数除法)。