Преобразование ndarray из float32 в uint8 приводит к искажению изображения

#python #numpy

#python #numpy

Вопрос:

После этого блога я пытаюсь применить тепловую карту к исходному изображению.

Однако у меня проблема с преобразованием float32 в uint8. Перед преобразованием в uint8, если я сохраню изображение с:

 plt.imshow(heatmap)
plt.savefig(f'{directory}/heatmap.png', bbox_inches='tight', pad_inches=0.0)
  

выведет это изображение:

введите описание изображения здесь

После строки heatmap = np.uint8(255 * heatmap) я снова сохраняю изображение и получаю следующий вывод:

введите описание изображения здесь

Форма изображения в обоих случаях (600, 600) . Итак, как я могу сделать, чтобы 2-е изображение было таким же, как 1-е после использования uint8?

Комментарии:

1. Когда я пытаюсь это сделать, все работает нормально. Можете ли вы опубликовать полный код, который вы использовали?

2. Забавно, что после вашего комментария я попробовал это на np.random.rand (32, 32), и все сработало нормально. Однако я сбросил свой ndarray в файл .npy, где я получаю те же результаты. Ссылка: ufile.io/gq308 »

Ответ №1:

У вас есть только отрицательные значения в heatmap . Поскольку uint8 может содержать числа только между 0 и 255 , строка heatmap = np.uint8(255 * heatmap) будет работать так, как задумано, только если исходные значения heatmap лежат между 0. и 1. .

Решение:
Измените масштаб массива до диапазона [0,255] перед приведением его к uint8 :

 heatmap = np.uint8(np.interp(heatmap, (heatmap.min(), heatmap.max()), (0, 255)))