为什么在matlab中读取图像时必须使用double?

时间:2013-03-26 03:03:26

标签: image matlab double

我正在参加一个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

为什么会这样?

1 个答案:

答案 0 :(得分:6)

您无需在MATLAB中将图像读取为double。默认情况下,图像是uint8类型的元素矩阵,其范围为0到255.根据您的计算需要,您可以将图像转换为各种类型(uint16uint32uint64double等等......)。

在您的情况下,平方uint8元素的值会导致溢出,这就是您看到最大值为255的原因。