Отображать изображение только в канале R (красный) с использованием Python - PullRequest
0 голосов
/ 03 октября 2018

Привет, я очень новичок в обработке изображений, теперь я играю с изображениями, используя python, чтобы получить больше информации.Тем не менее, я немного расстроен пониманием цветовых каналов.

На мой взгляд, RGB-изображение формы (400, 400, 3) означает, что изображение состоит из 3 каналов, и каждый канал имеет 400 * 400 пикселей.Три пикселя разных цветов в одной и той же позиции представляют собой целый пиксель в полном изображении.

Таким образом, изображение [:,:, 0] представляет изображение в красном канале.Если я показываю это, это должно дать изображение полностью красного цвета.Я так и сделал, но вывод не идеален:

plt.figure(figsize=(15,5))
plt.imshow(im[:,:,0])  # im is the image

Извините, но у меня еще недостаточно средств для загрузки изображения, вывод выше зеленоватый, но не совсем зеленый.

Затем я взял идею от других, которые присваивают im [:,:, 0] массиву нулей, который имеет ту же форму, что и изображение.Тогда вывод полностью красный.Код:

tmp_im = np.zeros(im.shape, dtype="uint8")
tmp_im[:,:,0] = im[:,:,0]
plt.figure(figsize=(15,5))
plt.imshow(tmp_im)

Итак, я подумал, единственное различие между этими двумя параметрами - это параметр imshow () в первом коде - 2D, который просто содержит элементы в R-канале.Тем не менее, второй является трехмерным, хотя элементы в двух других каналах равны 0. Является ли это причиной получения другого выхода?

Пожалуйста, исправьте меня, если какое-либо из моих пониманий неверно.

Большое спасибо заранее.

1 Ответ

0 голосов
/ 03 октября 2018

Да, правильно.В первом случае вы извлекаете двумерный массив из изображения и imshow по умолчанию применяет стандартную цветовую карту viridis afaik, которая на самом деле зеленоватая.Это подходит для массивов данных, которые должны отображаться в виде тепловой карты, но не для изображений.

С другой стороны, трехмерный массив, то есть массив со значениями RGB, автоматически интерпретируется как изображение как imshow.Поэтому, если в этом случае только первый компонент отличается от 0, вы получите красную картинку.

Однако вы можете заставить imshow использовать выбранную вами цветовую карту для 2D-массивов с помощьюcmap kwarg:

plt.imshow(img_name, cmap=cm_name)

с cm_name, например, одним из 'Greys' или 'Greys_r', чтобы получить представление изображения в градациях серого (или R-канал в вашем случае).И, конечно же, доступны также 'Reds' и 'Reds_r' - угадайте, что ...
Для полного списка просто поместите опечатку в имя cm_name - сообщение об ошибке довольно многословно и информативно:

Possible values are: Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot, gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, seismic, seismic_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, viridis, viridis_r, winter, winter_r

Чтобы показать различия, вот пример графика:

enter image description here

, созданный со следующим кодом:

import imageio
import matplotlib.pyplot as plt
import numpy as np
im = imageio.imread('imageio:chelsea.png')
im_r = np.zeros(np.shape(im))
im_r[:, :, 0] = im[:, :, 0]
fig, axs = plt.subplots(2, 2, figsize=(10, 8))
axs[0, 0].imshow(im[:, :, 0])
axs[1, 0].imshow(im[:, :, 0], cmap='Greys_r')
axs[0, 1].imshow(im[:, :, 0], cmap='Reds_r')
axs[1, 1].imshow(im_r.astype(int))
axs[0, 0].set_title('pure imshow of 2D-array (R-channel)')
axs[1, 0].set_title('imshow of 2D-array with cmap="Grey_r"')
axs[0, 1].set_title('imshow of 2D-array with cmap="Reds_r"')
axs[1, 1].set_title('imshow of 3D-array with coordinates 1 and 2 \n(i.e.: channels G and B) set to 0')
plt.tight_layout()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...