【问题标题】:How to make OpenCv show an image in combination of two color channels?如何使 OpenCv 结合两个颜色通道显示图像?
【发布时间】:2019-01-14 22:22:28
【问题描述】:

使用 OpenCV 从图像中获取一个颜色通道的输出并不难,而且很容易做到。

但是是否有可能从图像的三种主要 BGR 颜色中,我想直接使用函数以绿色和红色的组合而不是蓝色来查看图像?

所以我可以通过将所有蓝色值设置为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 函数适用于整个 3 维值而不适用于二维?

如果他们尝试使用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 是执行此操作的唯一方法?

所以这是我正在处理的图像(实际上可以使用任何类型的图像):

这是我执行的输出(我想使用一些内置函数而不是将某些值设置为 0):

这可能吗?

【问题讨论】:

  • 这是因为大多数图像通常是 1、3 或 4 通道。我不知道有任何处理 2 通道图像的库。无论如何,在 python 中,您可以像img_copy = img.copy(), img_copy[:,:,0] = 0 一样轻松地将频道设置为0
  • 我知道设置等于 0 的事情,我已经在问题中提到了这一点。但是,如果我能够通过这个来执行它,我不能使用函数本身来执行它吗?真正的问题是我正在处理许多图像,我需要在每个图像中以两种或多种方式执行此操作。我不想为每个图像创建多个副本。所以希望我只能从一个对象获得输出。

标签: python image opencv


【解决方案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()

【讨论】:

  • 这是一个非常有趣和独特的方法马克。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 2016-01-19
  • 2021-03-29
相关资源
最近更新 更多