Numpy matshow создает пустое изображение, несмотря на то, что dtype является плавающим

#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')
 

С некоторыми поддельными данными это результат до и после нормализации:

до и после нормализации