我正在参加一个matlab编程课,教师告诉我们要总是写
img = double(imread('file.tif'));
而不是
img = imread('file.tif');
因为省略double(...)
可能会“导致错误”。我对这些错误发生的原因感到困惑。
这是一个示例交互式会话,其中我取每个像素的平方值(注意 - 输入图像是灰度),并且只有当我们使用double时该值才是正确的:
>> img = imread('cat.tif');
>> img_double = double(imread('cat.tif'));
>> img = img .^2;
>> img_double = img_double .^2;
>> img(1:10, 1:10)
ans =
255 255 255 255 255 255 255 255 255 255
225 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 121
255 255 255 255 255 255 255 255 255 49
>> img_double(1:10, 1:10)
ans =
Columns 1 through 5
16129 16129 16129 16129 16129
225 361 625 1089 1681
324 484 961 1681 2209
400 729 1369 2401 3025
576 1225 2209 3249 3969
900 1849 3025 4096 4900
1369 2809 4096 5184 5625
2209 3969 5476 6241 6241
3249 5041 6400 7056 6724
4489 6241 7569 7569 6724
Columns 6 through 10
16129 16129 16129 16129 16129
2025 2209 2209 1849 1521
2809 2809 2401 2025 1521
3249 3249 2809 2025 1369
3969 3481 2809 1849 1089
4624 3969 2809 1681 841
5041 3969 2601 1369 529
5184 3721 2209 961 289
5184 3481 1681 576 121
5041 2809 1225 289 49
为什么会这样?
答案 0 :(得分:6)
您无需在MATLAB中将图像读取为double。默认情况下,图像是uint8
类型的元素矩阵,其范围为0到255.根据您的计算需要,您可以将图像转换为各种类型(uint16
, uint32
,uint64
,double
等等......)。
在您的情况下,平方uint8
元素的值会导致溢出,这就是您看到最大值为255的原因。