Как сохранить плавающее число в виде пикселя 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')
Другие альтернативы включают
Наблюдаемое вами поведение зависит от формата файла, в котором вы сохраняете изображение. Некоторые форматы изображений имеют спецификации для значений пикселей с плавающей запятой. Хотя некоторые делают, в первую очередь 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