你能解释一下matlab函数的不一致性吗?
基本上,这个函数作为输入给定一个int矩阵a,它规范化0…1范围内的值:
例子:

I1 = reshape(uint8(linspace(1,255,9)),[3 3])
I2 = im2double(I1)

I1 =

    1   96  192
   33  128  223
   65  160  255


I2 =

    0.0039    0.3765    0.7529
    0.1294    0.5020    0.8745
    0.2549    0.6275    1.0000

但现在如果我提供一个双重矩阵:
I1 =

    0.1000    0.2000
    1.5000    2.2000

im2double的结果是相同的矩阵I1(因此没有任何规范化)我能理解这种不合理的行为吗?

最佳答案

键入help im2double。前几行是
IM2DOUBLE将图像作为输入,并返回类的图像
加倍如果
输入图像为双级,输出图像与之相同如果
输入图像不是双精度的,IM2DOUBLE返回
类double,根据需要重新调整或偏移数据。
所以这种行为是故意的实际上,当在编辑器中打开im2double.m时,您将看到

function d = im2double(img, typestr)
...
if isa(img, 'double')
    d = img;
...

end

是否直观,嗯,这是有争议的:)
不管怎样,这种行为是有原因的输入类型为int8时,您知道天花板是什么(255)利用这些信息,您可以重新缩放输出(values/255)类似于int16(values/65535)等。
然而,当你得到一个double,你就不再有一个现实的上限对于大多数double值,values/realmax << realmin,所以重新缩放没有什么意义。
您可以争辩说255将是一个很好的默认值,并警告说,如果打算使用16位数据,您应该给出一个额外的参数但是…这会变得很难看,使函数变得不必要的复杂我可以理解马修斯在这种情况下保留原作的决定。

10-05 23:59