Как сохранить плавающее число в виде пикселя RGB в изображении

Я хочу сохранить числа с плавающей точкой в ​​виде пикселей в изображении. В настоящее время я работаю в opencv-python, но я также попробовал это с пакетом Pillow(PIL). Оба пакета преобразуют данные с плавающей точкой в ​​целое число перед сохранением их в изображение.

Я хочу сохранить:

(245.7865, 123.18788, 98.9866) in image.

но когда я открываю сохраненное изображение, я получаю:

(246,123,99)

Каким-то образом мои плавающие числа округляются и преобразуются в целые числа. Как остановить PIL или OpenCv от преобразования их в целое число??

1 ответ

Растровые изображения обычно хранятся только в виде целочисленных значений. Вместо этого сохраните массив NumPy непосредственно так

x = numpy.array([1, 2, 3])
with open('x.npy', 'wb') as f:
    numpy.save(f, x)

Затем загрузите переменную обратно так

x = numpy.load('x.npy')

Другие альтернативы включают

  • Сохраните одно или несколько изображений GRAY16 PNG с умножением и усечением поплавков.
  • Используйте формат Netpbm, поддерживающий числа с плавающей точкой.
  • Сохранить соленье.

Наблюдаемое вами поведение зависит от формата файла, в котором вы сохраняете изображение. Некоторые форматы изображений имеют спецификации для значений пикселей с плавающей запятой. Хотя некоторые делают, в первую очередь TIFF.

Чтобы продемонстрировать желаемое поведение с помощью средства записи изображений TIFF, рассмотрите следующий сценарий. Он использует универсальную библиотеку ввода / вывода изображений ImageIO, которая использует PILlow в качестве одного из своих внутренних компонентов:

# Use stackru logo as sample image.
import imageio
logo = 'https://cdn.sstatic.net/Sites/stackru/img/logo.png'
image = imageio.imread(logo)

# Normalize to 1. Pixel values are now floating-point.
image = image / image.max()

# Save as image file and read back in.
format = 'tiff'
imageio.imwrite(f'image.{format}', image)
print(f'wrote: {image.dtype}')
image = imageio.imread(f'image.{format}')
print(f'read:  {image.dtype}')

Результат этого скрипта:

wrote: float64
read:  float64

Если, с другой стороны, вы измените формат на PNG (format = 'png' в коде) вывод:

Lossy conversion from float64 to uint8. Range [0, 1].
Convert image to uint8 prior to saving to suppress this warning.
wrote: float64
read:  uint8
Другие вопросы по тегам