Преобразование массива с использованием scikit-image: из целого числа в число с плавающей запятой

Я столкнулся с какой-то проблемой при преобразовании целочисленного изображения в изображение с плавающей запятой с использованием scikit-image.

Это пример (изображение представляет собой изображение размером 2 пикселя):

from numpy import array,uint8;
import skimage;

rgb = array([array([[0,0,0],[0,0,5]])]) 
i1 = skimage.img_as_float(rgb)#rgb.dtype ->dtype('int32')
i2 = skimage.img_as_float(rgb.astype(uint8))
i3 = skimage.img_as_float(rgb.astype(float))

print i1[0,1,:]
print i2[0,1,:]
print i3[0,1,:]

Я ожидал этого:

[ 0.  0.  5.]
[ 0.  0.  5.]
[ 0.  0.  5.]

Но я получил это:

[  2.32830644e-10   2.32830644e-10   2.56113708e-09]
[ 0.          0.          0.01960784]
[ 0.  0.  5.]

Потеря точности от float до int — это нормально, но здесь я теряю реальную информацию при переходе от int к float с использованием img_as_float. Я ничего не нашел при чтении кода на Гитхаб...

Почему это возможно?


person phyrox    schedule 29.01.2014    source источник


Ответы (1)


img_as_float() — это не просто преобразование типов, оно преобразует полный диапазон целых чисел без знака в [0, 1], полный диапазон целых чисел со знаком в [-1, 1].

  • i1, dtype — int32, означает преобразование [-2147483648, 2147483647] в [-1, 1]
  • i2, dtype — uint8, означает преобразование [0, 255] в [0, 1]
  • i3, так как dtype уже плавающий, ничего не делайте.
person HYRY    schedule 29.01.2014