Вам нужен формат изображения без потерь, который может сохранять числа с плавающей запятой:
- PNG может сохранять только до 16-битного целого,
- JPEG не без потерь и только 8-битное целое,
- GIF является целочисленным и 8-разрядным,
- NetPBM является только 16-разрядным целым числом.
, поэтому используйте TIFF со сжатием без потерь или без сжатия,В качестве альтернативы вы можете использовать PFM - Portable Float Map.
Вот демонстрация:
import numpy as np
from PIL import Image
# Generate a small float image in Numpy array
grey32 = np.random.randn(2,3).astype(np.float32)
# Convert to PIL Image and save
Image.fromarray(grey32).save('test.tif')
# Read back from disk and convert to Numpy array
reloaded = np.array(Image.open('test.tif'))
# Inspect
print(grey32)
array([[-0.28032717, -1.7696048 , -0.9811929 ],
[-0.7785768 , -1.2427857 , -0.33241433]], dtype=float32)
print(reloaded)
array([[-0.28032717, -1.7696048 , -0.9811929 ],
[-0.7785768 , -1.2427857 , -0.33241433]], dtype=float32)
Если ваш зритель не может показывать TIFFфайлы, содержащие числа с плавающей точкой, вы всегда можете преобразовать их во что-нибудь видимое с помощью ImageMagick :
magic float.tif -auto-level viewable.png
Я знаю, что tifffile и pyvips обахорошие библиотеки Python для работы с плавающими TIFF.