Как сохранить двумерные массивы с плавающей точкой без потерь в изображение в оттенках серого, сохраняя при этом разрешение? - PullRequest
1 голос
/ 30 сентября 2019

У меня есть некоторые значения поля температуры, которые я хочу преобразовать в изображения в градациях серого, при этом сохраняя разрешение . (Например, если это массив с плавающей точкой (100x100), тогда преобразование должно быть изображением в градациях серого (100x100)). Затем я обработаю изображение и преобразую его обратно в массив numpy Temperature. Часть обработки изображений может рассматриваться как процесс черного ящика.

Важно, чтобы конверсия была без потерь .

Кроме того, код для обработки изображений распознает .png & .jpg. (Я не уверен в распознавании других форматов файлов, включая TIFF. Кроме того, даже форматы JPG не являются предпочтительными, поскольку они приведут к преобразованию с потерями).

Мои попытки до сих пор:

  • imsave() у Matplotlib сохраняет разрешение и не имеет потерь. Но он преобразует изображение в RGB вместо оттенков серого. Этот подход мне тоже подходит, но я не могу точно преобразовать 3-канальное изображение RGB обратно в массив с плавающей точкой. Например, я взял массив 10x10 numpy float temperature, использовал plt.imsave('Temperature_profile.png',temperature). Затем я снова открыл то же изображение, но не смог найти точный способ преобразовать его обратно в (10x10) массив с плавающей точкой. Таким образом, проблема решается, если есть способ преобразовать обратно 3-канальное изображение в 2D-матрицу без потерь.

  • PIL * Image.fromarray() сохраняет разрешение и может сохранять изображение как изображение в градациях серого. Но я не смог сохранить матрицу без потерь и восстановить ее без потерь. Следовательно, я получу неправильные результаты. ( Преобразование двумерного массива значений оттенков серого в изображение в формате PIL )

  • scipy.misc.imsave() устарело.

  • imageio.imwrite() выдает предупреждение о конверсии с потерями. («Преобразование с потерями из float64 в uint8»).

  • opencv и cv2 по какой-то причине не распознаются моей средой spyder (python 3.7, Anaconda 4.7.12).

1 Ответ

1 голос
/ 30 сентября 2019

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

  • 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...