3

我正在上matlab编程课,老师告诉我们要一直写

img = double(imread('file.tif'));

而不是

img = imread('file.tif');

因为省略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

为什么会这样?

4

1 回答 1

6

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

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

于 2013-03-26T03:04:53.970 回答