Я начал обрабатывать изображения в python и наткнулся на проблему, которая сбивает с толку новичка. У меня есть набор данных из 1131 np массивов (изображений) МРТ на колене. Форма изображений какая-то странная, это (44, 256, 256)
означает, что в одном массиве 44 изображения размером 256x256 пикселей. Например, если я покажу 22-е изображение (среднее), с помощью plt.imshow(image[22])
я получу следующее:
Это изображение явно похоже на RGB, но если я делаю image[22].shape
, я получаю (256,256)
, что ожидаемо, но в то же время сбивает с толку, потому что оно говорит, что у него нет каналов, и, насколько я знаю, изображения, у которых нет каналов, должны быть в оттенках серого. цвет, но это явно не тот случай.
Я нырнул глубже и попытался выполнить cv2.cvtColor(image[22, :, :], cv2.COLOR_BGR2RGB)
, что привело к:
Это похоже на изображение в градациях серого, но форма этого изображения (256, 256, 3)
. Это так сбивает меня с толку, и может ли кто-нибудь указать, почему это происходит, изображение в градациях серого с 3 каналами и цветное изображение без каналов, и как я могу получить это image[22]
в режиме градаций серого с 1 каналом? Мне нужно это в 1 канале, потому что я хочу сделать извлечение функций, но если я сделаю это таким образом, чистый image[22]
и вариант «оттенки серого» будут иметь одинаковые значения для каждой функции, но, судя по всему, они не кажутся точно.
Массив numpy (изображение) можно взять из здесь.
ваше изображение представляет собой 3D-изображение, а не 2D-изображение с цветами. Каждая из этих 44 - это отдельная "глубина". Скорее всего, это всего лишь несколько кусочков колена.
Имеет смысл, спасибо, что указали на @AnderBiguri
если кто-то хочет пометить это как дубликат любого из ранее заданных вопросов в этом направлении...
Изображение монохромное, но по умолчанию imshow
сопоставляет пиксели с цветовой картой по умолчанию, viridis
.
См. https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html
В дополнение к ответу @thebiss, если вы измените порядок размеров с помощью transpose(), вы можете просмотреть любые три изображения из вашего стека из 44 в виде RGB с помощью imshow(). В приведенном ниже примере я просматриваю фрагменты 10, 11 и 12.
import numpy as np
data = np.random.random([44,256,256])
datar = np.transpose(data ,axes=(1,2,0))
print(data.shape,datar.shape)
plt.imshow(datar[:,:,10:13])
Это цветовая карта matplotlib по умолчанию, которую вы видите на первом изображении (называемом Viridis). Это не означает, что изображение не в градациях серого, просто оно отображает его в определенной цветовой карте. Проверьте здесь, как по умолчанию использовать matplotlib в оттенках серого. stackoverflow.com/questions/33185037/…