Сохранение изображений с плавающей точкой - PullRequest
0 голосов
/ 25 сентября 2018

Вот код, который я сейчас использую:

from PIL import Image
import numpy as np

def save_np_img(np_img, path, name):
    """
    To save the image.
    :param np_img: numpy_array type image
    :param path: string type of the existing path where to save the image
    :param name: string type that includes the format (ex:"bob.png")
    :return: numpy array
    """

    assert isinstance(path, str), 'Path of wrong type! (Must be String)'
    assert isinstance(name, str), 'Name of wrong type! (Must be String)'

    im = Image.fromarray(np_img)
    im.save(path + name)

    return np_img

Я хотел бы иметь возможность сохранять изображения, содержащие значения float, так же, как я могу в настоящее время сохранять int значения-изображения.

Я получаю сообщение TypeError, когда пытаюсь сохранить мои изображения, которые были преобразованы с помощью np.divide(img, 255.), и, таким образом, при попытке сохранить numpy_arrays, которые содержат числа с плавающей запятой.

(Вы можете предложитьи другие библиотеки тоже.)

ПРИМЕЧАНИЕ: Значения, если они не являются целыми числами от 0 до 255, являются числами от 0 до 1. Для меня крайне важно оставаться настолько без потерь, насколько это возможно.Первоначально я думал, что могу просто использовать np.multiply(img, 255), но я не был уверен, что это потеряло бы некоторую точность (и не вернет ли оно целые числа на самом деле).

РЕДАКТИРОВАТЬ: В основномЯвляется ли этот метод преобразованием без потерь?То есть, если у меня был numpy_array ints, разделенный на 255., а затем преобразованный в ints, я теряю информацию?Если да, то как этого избежать?

1 Ответ

0 голосов
/ 25 сентября 2018

Вы можете сохранять и считывать numpy массивы с плавающей точкой без потерь и без каких-либо дополнительных библиотек:

import numpy as np

# Create 10 random floats in range 0..1 in array "b"
b = np.random.random_sample((10,)).astype(np.float32)

# Save to file
np.save('BunchOfFloats.npy',b)

# Read back into different array "r"
r = np.load('BunchOfFloats.npy')

# Inspect b 
array([0.26565347, 0.7193414 , 0.19435954, 0.58980538, 0.28096624,
   0.88655137, 0.84847042, 0.80156026, 0.94315194, 0.76888901])

# Inspect r
array([0.26565347, 0.7193414 , 0.19435954, 0.58980538, 0.28096624,
   0.88655137, 0.84847042, 0.80156026, 0.94315194, 0.76888901])

Документация доступна здесь .


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

import numpy as np
from tifffile import imsave

# Generate float data
b=np.random.random_sample((768,1024,3)).astype(np.float32)

# Save as TIF - when reading, use "data = imread('file.tif')"
imsave('result.tif',b)

Еще одна опция - это файл PFM,описано здесь и здесь .

Это очень простой формат, который вы можете писать и читать самостоятельно, и имеет то преимущество, что другие пакеты, такие как ImageMagick и GIMP понимают это, поэтому вы можете сохранить свои данные в виде PFM файла и затем преобразовать в командной строке с ImageMagick в JPEG или PNG дляпросмотр:

magick image.pfm -auto-level result.png
...