Отображение изображения с несколькими каналами

Вот мой ожидаемый результат

Я загрузил подходящее изображение с несколькими каналами из CASA. Я попытался загрузить изображение, как обычное изображение, но оно показывает ошибку

«Недопустимые размеры для данных изображения».

Изображение имеет форму (1, 20, 250, 250).

Есть ли способ отобразить все каналы?

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

file2 = "Downloads/PVDiagramtest2.fits"
image_data = fits.getdata(file2)

image_data = image_data[~np.isnan(image_data)]

plt.figure()
plt.imshow(image_data[0,0,:,:])

plt.show()

person MUFC_Rules    schedule 06.08.2019    source источник
comment
Абстрактно говоря, каждый канал — это просто еще одно 2D-изображение, поэтому вопрос, который вы должны задать в первую очередь, заключается в том, как именно вы хотите отображать все каналы? В сочетании с каким-то ложным цветным изображением? Каким-то образом сложены в массив изображений? Вы должны были бы задать себе этот вопрос в первую очередь.   -  person Iguananaut    schedule 07.08.2019
comment
Я только что разместил изображение карт каналов, которые я создал с помощью CASA. Я хочу, чтобы это отображалось как-то так.   -  person MUFC_Rules    schedule 07.08.2019


Ответы (1)


Чтобы увидеть все изображения, вы можете пройтись по сюжетам. Игрушечный пример того, как объединить несколько изображений, будет выглядеть примерно так:

import numpy as np
import matplotlib.pyplot as plt   

x = np.random.rand(10)
y = np.random.rand(10)
z = np.sqrt(x**2 + y**2)

for i in range(16):
    plt.subplot(4, 4, i+1)
    plt.scatter(x, y, s=80, c=z, marker=verts)
plt.show() 

В вашем случае, я думаю, это может выглядеть примерно так:

from astropy.io import fits
# import numpy as np
import matplotlib.pyplot as plt   

file = "WFPC2u5780205r_c0fx.fits"


image_data = fits.getdata(file)

# image_data = image_data[~np.isnan(image_data)]


num_channels = 4
x_dim = 2
y_dim = 2
colors = ['rainbow', 'PuRd_r', 'gist_earth', 'coolwarm']
for i in range(num_channels):
    plt.subplot(x_dim, y_dim, i+1)
    plt.imshow(image_data[i,:,:], cmap=colors[i])
plt.show()

Следует отметить, что я прокомментировал, где вы переворачиваете биты на np.isnan(), потому что это, кажется, сглаживает массив изображений, и я не вижу рационального использования этого типа подхода, когда он только кажется вводит проблему. Однако, возможно, с вашими данными он ведет себя так, как вам нравится.

В этом примере я использовал первый образец файла FITS, доступный в службе поддержки FITS. Изображение 4-канальное 200х200 пикселей. Помимо создания сетки 2x2 с использованием подграфиков, я не форматировал изображение. Вот выходное изображение из этого примера кода:введите здесь описание изображения

person Community    schedule 08.08.2019
comment
Привет, большое спасибо за ваш вклад. Я все еще сталкиваюсь с этой ошибкой. Число должно быть 1 ‹= число ‹= 20, а не 0. Я думаю, это потому, что номера каналов начинаются с 1 до 20, а нулевого канала нет. Я попробовал оператор if и else, но, похоже, он не работает. - person MUFC_Rules; 08.08.2019
comment
Тогда попробуйте увеличить диапазон с 1. я обновил код - person ; 08.08.2019
comment
Это последняя ошибка, с которой я столкнулся со слишком большим количеством индексов для массива. В данных много значений nan, но я учел это с помощью np.isnan. - person MUFC_Rules; 08.08.2019
comment
Если вы можете опубликовать образец, например PVDiagramtest2.fits, будет намного проще понять, что именно будет работать. - person ; 08.08.2019
comment
Переполнение стека, похоже, не позволяет мне публиковать файлы, и когда я пытаюсь изменить расширение fits на png, он говорит, что файл слишком велик. - person MUFC_Rules; 09.08.2019
comment
Я обновил файл с образцом, чтобы вы могли попробовать. - person ; 09.08.2019
comment
Большое спасибо, Майк, теперь все работает. np.isnan дал другую форму, которую я никогда не принимал во внимание. - person MUFC_Rules; 12.08.2019