matlab imread函数混淆
Matlab imread function confusion
我正在灰度图像中实现蚁群算法,但我对获得正确的启发式值感到困惑。我总是得到 0 或 1。
这是代码的一部分:
x = imread('test.jpg');
y = max(x(:));
例如,我得到 226 作为最大强度值。我尝试 x/y 并得到一个矩阵,其中单个数字强度值的值为 1,大部分为 0。这里有我遗漏的部分吗?
我尝试创建一个零 4x4 矩阵,对角线为 255。然后我将它除以 y。我得到一些 "same integer class error".
这是因为你用imread
读取的图像类型是无符号整数类型之一,很可能是uint8
所以当你进行除法时,它实际上是执行整数除法,因此 "decimal values" 被截断或删除。这是一个可重现的例子。假设我有以下 uint8
格式的 2 x 2 图片:
>> A = uint8([1 2; 3 4])
A =
1 2
3 4
现在,如果我尝试将每个强度图像除以 4,我得到:
>> B = A / 4
B =
0 1
1 1
这是因为图像类型是uint8
所以当除法运算结果是浮点数时,结果是rounded,这是很可能是您的情况。
如果要保持浮点精度,需要将图像显式转换为double
:
x = imread('test.jpg');
x = double(x); %// Change
y = max(x(:));
out = x / y;
顺便说一句,既然你想对图像进行归一化,使其落在 [0,1]
的范围内,我强烈建议你不要这样做 并使用 im2double
函数代替。它将为您执行此规范化并进行其他健全性检查:
x = imread('test.jpg');
out = im2double(x);
我正在灰度图像中实现蚁群算法,但我对获得正确的启发式值感到困惑。我总是得到 0 或 1。
这是代码的一部分:
x = imread('test.jpg');
y = max(x(:));
例如,我得到 226 作为最大强度值。我尝试 x/y 并得到一个矩阵,其中单个数字强度值的值为 1,大部分为 0。这里有我遗漏的部分吗?
我尝试创建一个零 4x4 矩阵,对角线为 255。然后我将它除以 y。我得到一些 "same integer class error".
这是因为你用imread
读取的图像类型是无符号整数类型之一,很可能是uint8
所以当你进行除法时,它实际上是执行整数除法,因此 "decimal values" 被截断或删除。这是一个可重现的例子。假设我有以下 uint8
格式的 2 x 2 图片:
>> A = uint8([1 2; 3 4])
A =
1 2
3 4
现在,如果我尝试将每个强度图像除以 4,我得到:
>> B = A / 4
B =
0 1
1 1
这是因为图像类型是uint8
所以当除法运算结果是浮点数时,结果是rounded,这是很可能是您的情况。
如果要保持浮点精度,需要将图像显式转换为double
:
x = imread('test.jpg');
x = double(x); %// Change
y = max(x(:));
out = x / y;
顺便说一句,既然你想对图像进行归一化,使其落在 [0,1]
的范围内,我强烈建议你不要这样做 并使用 im2double
函数代替。它将为您执行此规范化并进行其他健全性检查:
x = imread('test.jpg');
out = im2double(x);