Как заставить OpenCv показывать изображение в сочетании двух цветовых каналов?

Использовать OpenCV для вывода одного цветового канала из изображения не так уж и сложно, и это легко сделать.

Но возможно ли, что из трех основных цветов BGR изображения я хочу видеть изображение только в комбинации зеленого и красного без синего, используя функцию напрямую?

Итак, я могу выполнить эту операцию, указанную выше, установив все значения Blue на 0, а затем увидеть изображение, код которого ниже:

    import cv2
    import numpy as np

    gr = cv2.imread('imagetowork2.jpg')
    gr[:, :, 0] = 0

    cv2.namedWindow("random_image",cv2.WINDOW_NORMAL)
    cv2.resizeWindow("random_image",590,332)
    cv2.imshow("random_image",gr)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Мне пришлось прибегнуть к этому приведенному выше коду, потому что работа с этим gr[:, :, 1:3] не работала. И я не понимаю, почему функции cv2 работают со всеми трехмерными значениями, но не с двухмерными?

Это ошибка, которая возникает, если они пытаются показать изображение с помощью gr[:, :, 1:3]:

error: OpenCV(3.4.5) C:\projects\opencv-python\opencv\modules\imgcodecs\src\utils.cpp:622: error: (-15:Bad number of channels) Source image must have 1, 3 or 4 channels in function 'cvConvertImage'

Итак, мой прямой и главный вопрос: есть ли встроенная функция для выполнения этого в OpenCV или любой другой библиотеке напрямую или установка всего значения цвета как 0 - единственный способ сделать это?

Итак, это изображение, над которым я работаю (на самом деле могу использовать любое изображение): Как заставить OpenCv показывать изображение в сочетании двух цветовых каналов?

И это результат того, что я выполнил (который я хочу получить, используя некоторую встроенную функцию и не устанавливая некоторые значения на 0): Как заставить OpenCv показывать изображение в сочетании двух цветовых каналов?

Это вообще возможно?

Это потому, что обычно большинство изображений имеют 1,3 или 4 канала. Я не знаю ни одной библиотеки, которая обрабатывала бы двухканальные изображения. В любом случае, в python вы можете довольно легко установить канал на 0, например, на img_copy = img.copy(), img_copy[:,:,0] = 0.

Quang Hoang 09.01.2019 20:54

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

Amit Amola 09.01.2019 21:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
572
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вы могли бы держать каналы по отдельности и комбинировать то, что вы хотите для просмотра:

#!/usr/local/bin/python3

import numpy as np
import cv2

im    = cv2.imread('sd71Z.jpg')
b,g,r = cv2.split(im)
zeros = np.zeros_like(b)

cv2.imshow("Zero blue",  cv2.merge([zeros,g,r]))
cv2.imshow("Zero green", cv2.merge([b,zeros,r]))
cv2.imshow('Zero red',   cv2.merge([b,g,zeros]))
cv2.waitKey()

Это был действительно интересный и уникальный подход Марка. Спасибо за ответ.

Amit Amola 14.01.2019 18:28

Другие вопросы по теме