我正在阅读使用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]
之间?
答案 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 doubles
为a
类型。 uint16
格式可能会遇到溢出问题。
答案 1 :(得分:2)
Matlab中的许多内置函数都希望数组为double
- 它们可能会检查数据类型,如果不是,则会失败。简单示例 - 如果您想要所有像素值的总和,保持uint16
中的数据将很快导致(可能是静默的)溢出。你不希望这种情况发生。
虽然uint16
是用于存储数据的紧凑格式,但double
是执行各种计算的更好类型,而不必担心这些事情。
至于将图像转换为范围[0,1] - 这意味着图像表示例程不需要进一步缩放(许多例程期望值介于0 - 黑色和1 - 白色之间(或“完全红,绿,蓝”。
答案 2 :(得分:2)
除了在其他答案中已经陈述的内容之外,还有一个更紧迫的原因:在Matlab中,许多操作未定义(1),或表现不同 (2),关于整数类型
未定义:尝试此伽马校正:uint16(100)^2.2
:您将收到错误Integers can only be raised to positive integral powers.
您需要转换为double
(
表现不同:假设您想在伽马校正之前将图像single
标准化为范围[0,1]。你会做f
之类的事情。但这只会给您f/intmax('uint16')
或0
个值!这是因为整数除法返回一个整数(忽略余数),1
中的任何值都小于或等于f
。因此,您应首先转换为intmax('uint16')
(或double
)以获得预期结果(实数除法)。