Использование 32-битных изображений Lab в Tensorflow

Я использую skimage для преобразования изображений RGB в цветовое пространство Lab, но кажется, что skimage использует тип данных float64, а Tensorflow использует float32.

Есть ли способ преобразовать 64-битное лабораторное изображение в 32-битный тип данных? Документация не содержит ничего конкретного по этому поводу, и я не уверен, что использование image.astype(np.float32) — это правильный путь, поскольку это может повредить точности данных (или нет).

Вот часть кода:

from skimage import color, io
import numpy as np    

rgb = io.imread('Test.jpg') # Could be any shape
lab = color.rgb2lab(rgb)

converted = np.array(lab).astype(np.float32)
rgb = color.lab2rgb(converted)

Последняя строка выдает ошибку:

ValueError: Images of type float must be between -1 and 1.

и вот трассировка стека:

  File "C:\Anaconda3\lib\site-packages\skimage\color\colorconv.py", line 928, in lab2rgb
    return xyz2rgb(lab2xyz(lab))
  File "C:\Anaconda3\lib\site-packages\skimage\color\colorconv.py", line 855, in lab2xyz
    arr = _prepare_colorarray(lab).copy()
  File "C:\Anaconda3\lib\site-packages\skimage\color\colorconv.py", line 153, in _prepare_colorarray
    return dtype.img_as_float(arr)
  File "C:\Anaconda3\lib\site-packages\skimage\util\dtype.py", line 291, in img_as_float
    return convert(image, np.float64, force_copy)
  File "C:\Anaconda3\lib\site-packages\skimage\util\dtype.py", line 195, in convert
    raise ValueError("Images of type float must be between -1 and 1.")
ValueError: Images of type float must be between -1 and 1.

person Cypher    schedule 21.01.2017    source источник


Ответы (2)


Использование x.astype(np.float32) вполне приемлемо. Такой уровень точности вам вряд ли понадобится.

Однако, если вы не будете осторожны, вы можете случайно преобразовать целочисленное изображение (например, беззнаковые байты, идущие от 0 до 255) в число с плавающей запятой. Таким образом, самый безопасный подход, который будет масштабироваться по мере необходимости, это

from skimage import img_as_float
image = img_as_float(image).astype(np.float32)
person Stefan van der Walt    schedule 21.01.2017
comment
Использование img_as_float(lab).astype(np.float32) дает мне ту же ошибку, что и использование np.array(lab).astype(np.float32) => Images of type float must be between -1 and 1. Вы даже можете попробовать код самостоятельно. - person Cypher; 22.01.2017
comment
Если вы начнете с массива с плавающей запятой, который не находится между -1 и 1, вы можете столкнуться с этой проблемой. Если вы опубликуете пример изображения или сможете проиллюстрировать свою проблему на одном из skimage.data примеров изображений, я буду рад взглянуть еще раз. - person Stefan van der Walt; 25.01.2017

Эту ошибку было сложно отследить.

Если вы используете float32, вы получите ошибку, как описано; однако ошибка исчезнет, ​​если вы вместо этого используете значения float64.

Надеюсь, это поможет! :)

Известный источник ошибки: Scikit-image Issue

person Steven    schedule 12.01.2019