2016-03-31 5 views
6

Я пытаюсь получить красный цвет канала пространство изображения, в настоящее время, как я это делаю, я получаю grayscale изображение:Как получить красное цветовое пространство изображения?

img = img[:,:,2] 

Но я хочу, изображение вроде этого:

enter image description here

Выше, верхнее изображение - это цветное изображение красного канала, а нижнее - исходное изображение. Что именно делается для достижения этого образа?

Я также попытался

img[:,:,0] = 0 
img[:,:,1] = 0 

Но результат, полученный не по желанию. Вот статья о цветовом пространстве красного канала: https://en.wikipedia.org/wiki/RG_color_space

+0

Возможно, вам просто нужно установить синий канал на 0 в исходном изображении BGR: 'img [:,:, 0] = 0' – Miki

+0

Я пробовал, но результат сильно отличается от результата в imgur. –

+1

Мне кажется, что удаляемый цветовой канал не красный, а сочетание зеленого и синего. Я предлагаю вам открыть изображение в InkScape (или любое другое программное обеспечение для обработки изображений) и воспроизвести цвета. После того как вы определили правильную комбинацию, удалите напоминание. – Crolle

ответ

1

На самом деле, ваше ожидаемое выходное изображение не является цветовым пространством красного канала оригинального. Это своего рода COLORMAP, который был применен на входном изображении. Хорошей новостью является то, что OpenCV предлагает множество встроенных цветовых карт. Плохая новость заключается в том, что ваш ожидаемый результат не может генерироваться встроенными цветовыми картами OpenCV. Но не сдавайтесь, вы можете сопоставить цвета, используя пользовательскую таблицу поиска, используя функцию cv2.LUT().

Для лучшей демонстрации здесь некоторые примеры с вашим изображением:

img = cv2.imread('origin.png') 
im_color = cv2.applyColorMap(img, cv2.COLORMAP_HSV) 
cv2.imshow('mapped_image', im_color) 
# cv2.imwrite('result.png', im_color) 
cv2.waitKey(0) 

enter image description here

Здесь все OpenCV в Colormap-х:

print [sub for sub in dir(cv2) if sub.startswith('COLORMAP_')] 
['COLORMAP_AUTUMN', 'COLORMAP_BONE', 'COLORMAP_COOL', 'COLORMAP_HOT', 'COLORMAP_HSV', 'COLORMAP_JET', 'COLORMAP_OCEAN', 'COLORMAP_PINK', 'COLORMAP_RAINBOW', 'COLORMAP_SPRING', 'COLORMAP_SUMMER', 'COLORMAP_WINTER'] 

Пример для отображения цветов с использованием пользовательских таблица поиска с использованием cv2.LUT():

table = np.array([(i * invert_value) for i in np.arange(256)]).astype("uint8") 
cv2.LUT(image, table) 
+0

Отлично. Но 'cv2.LUT()' даст мне массив, я должен построить конструкцию или что-то еще? Если нет, то какой используется выходной массив 'cv2.LUT()'? –

+0

@stack Каждое изображение представляет собой массив :-), но вам нужно преобразовать его в соответствующий тип, чтобы можно было идентифицировать его как изображение с помощью OpenCV. позвольте мне обновить ответ на примере. – Kasramvd

+0

@stack Также обратите внимание, что вы можете выполнить какой-либо процесс по результату одного из встроенных 'COLORMAP', чтобы преобразовать его в ожидаемый результат. – Kasramvd

1

Ваше второе предложение должно выбросить синий и зеленый цвета и дать вам «изображение с красным каналом». Если вы хотите RG (красный-зеленый) цветовое пространство изображения, выбросить только синий канал:

img[:,:,0] = 0 

Но пример изображения вы размещены не показывают, что, как и полученное изображение имеет информацию оставили во всех трех каналы. Я предполагаю, что он был создан с «colormap», где разные цвета представляют разные значения красного в исходном изображении. Такое отображение может выглядеть так, как вам нравится, поэтому его непросто восстановить из вашего примера.

Смежные вопросы