matplotlib - преобразование из rgba обратно в целое число - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть 12-битная камера, которая принимает изображения в виде массива (значения целые).Когда я сохраняю массив через matplotlib как .png, а затем читаю его обратно, значения находятся в RGBA (как и ожидалось).После прочтения .png мне нужно иметь возможность преобразовать его обратно в исходное целочисленное значение.

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.stats import norm

# simulate some data
x = np.arange(0,100.1,1)
y1 = norm.pdf(x, loc=50, scale=20)
y2 = norm.pdf(x, loc=40, scale=10)
scaler = 1024/np.max(np.outer(y1,y2)) # img is 12 bits
img = np.outer(y1,y2)*scaler
img = img.astype(np.uint16) # force to be 16 bit as there is no 12 bit in np
print(np.max(img), np.min(img), img.shape)
plt.imshow(img)
plt.show()

plt.imsave(r"../img/sim.png", img, vmin=0, vmax=2**12, cmap='viridis')
img2 = plt.imread(r"../img/sim.png")
img2 # can we convert these RGBA values back to the original integers?

Я не могу понять, как преобразовать эти (эффективно) обратно в исходные целые числа.Я считаю, что это возможно, поскольку я прочитал, что .png использует сжатие без потерь.В основном мне нужно установить, что img2 равно img.

Я чувствую, что здесь определенно не хватает чего-то простого ...

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема связана со следующей строкой:

plt.imsave(r"../img/sim.png", img, vmin=0, vmax=2**12, cmap='viridis')

Когда вы задаете цветовую карту с помощью cmap='viridis', она квантирует ваше изображение до 8 бит, поэтому может использовать 256-цветовую палитру (самая большаявозможно) в PNG образ и бум!ваши 16-битные данные являются тостами (потеряны).

Если вы используете imageio, это может сохранить 16-битные данные, поэтому вы должны заменить вышеуказанную строку на:

import imageio                                                                                                                         
...
imageio.imwrite('12-bit.png',img)

Тосохранит ваши 16-битные данные.Потенциальная проблема заключается в том, что данные теперь серого цвета и их трудно увидеть.Это может не быть проблемой, поскольку вы могли сохранить данные только для того, чтобы сохранить их, а не визуализировать.Я думаю, что тогда у вас будет два варианта:

  • либо сохранить файл дважды (диск дешевый) - один раз в оттенках серого для хранения и один раз с картой цветов viridis для визуализации, или

  • просто сохраните один раз в оттенках серого и создайте «средство просмотра» , которое загружает оттенки серого и отображает его с помощью палитры viridis.

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