#python #numpy #matplotlib #imshow
Вопрос:
У меня есть скрипт, который принимает 3 массива numpy одинакового размера, создает массив ndarray с помощью dstack и предполагает отображение их в виде rgb-изображения.Однако последняя часть изображения RGB, кажется, работает, но я не могу отобразить изображение, и все, что я получаю, — это пустое изображение.
Вот как я создаю изображение из 3 массивов:
rgb_result=np.dstack((result[3,:,:],result[2,:,:],result[1,:,:]))
plt.figure(figsize=(10,6))
plt.matshow(rgb_result*5,fignum=1,aspect='auto')
plt.title(d)
plt.show()
В результате получается пустое изображение:
всякий раз, когда я рисую одну из полос, которая создает «rgb_result», она работает (три изображения очень похожи на это).:
Я также проверил тип каждой полосы и ndarray, и он был float64.
Мой вопрос в том, как я могу заставить matshow работать и показывать изображение в RGB.
Комментарии:
1. каковы
min()
ваши иmax()
вашиrgb_result
? ваш код создает правильное изображение rgb, когда я пытался использовать некоторые случайные данные, поэтому я думаю, что нам нужно увидеть фактический образец данных, который вызывает проблему (я не понизил голос).2. @tdy max() составляет 0,0135, а min () — 0,0
Ответ №1:
matshow
использует imshow
под капотом, который ожидает, что данные будут находиться в диапазоне 0-1 для поплавков или 0-255 для целых чисел:
(M, N, 3): изображение со значениями RGB (0-1 с плавающей точкой или 0-255 int).
Так rgb_result
как содержит поплавки, его следует нормализовать до 0-1 (вычесть мин и разделить на макс):
plt.matshow((rgb_result-rgb_result.min())/rgb_result.max(), fignum=1, aspect='auto')
Или, если rgb_result
гарантированно будет положительным, просто разделите на макс:
plt.matshow(rgb_result/rgb_result.max(), fignum=1, aspect='auto')
С некоторыми поддельными данными это результат до и после нормализации: