Как сохранить значения пикселей с плавающей точкой в ​​файле изображения - PullRequest
0 голосов
/ 13 мая 2018

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

Я хочу сохранить значения пикселей, такие как:

(245.7865, 123.18788, 98.9866)

Но когда я читаю обратно файл изображения, яget:

(246, 123, 99)

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

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

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

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

# Use Stack Overflow logo as sample image.
import imageio
logo = 'https://cdn.sstatic.net/Sites/stackoverflow/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
0 голосов
/ 13 мая 2018

Растровые изображения обычно хранятся только в виде целочисленных значений. Вместо этого сохраните массив 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 , поддерживающий числа с плавающей точкой.
  • Сохранить рассол .
...