如何解决在 Python 中合并 OpenCv 中的频道的问题?

Posted

技术标签:

【中文标题】如何解决在 Python 中合并 OpenCv 中的频道的问题?【英文标题】:How can I fix my problem with merging channels in OpenCv in Python? 【发布时间】:2020-09-21 20:23:46 【问题描述】:

我只是导入了一张图片。 我想将每个 BGR 通道与零数组合并,然后显示它们。 我的代码如下:

import cv2
import numpy as np
image = cv2.imread('./images/input.jpg')

B, G, R = cv2.split(image)

zeros = np.zeros((image.shape[:2]), dtype = 'int8')

cv2.imshow("Red", cv2.merge([zeros1, zeros1, R]))
cv2.imshow("Green", cv2.merge([zeros, G, zeros]))
cv2.imshow("Blue", cv2.merge([B, zeros, zeros]))

cv2.waitKey(500)
cv2.destroyAllWindows()

运行此代码后,我收到以下错误。

error                                     Traceback (most recent call last)
<ipython-input-13-9252d63ed763> in <module>
      7 zeros = np.zeros((image.shape[:2]), dtype = 'int8')
      8 
----> 9 cv2.imshow("Red", cv2.merge([zeros1, zeros1, R]))
     10 cv2.imshow("Green", cv2.merge([zeros, G, zeros]))
     11 cv2.imshow("Blue", cv2.merge([B, zeros, zeros]))

error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\core\src\merge.dispatch.cpp:129: error: (-215:Assertion failed) mv[i].size == mv[0].size && mv[i].depth() == depth in function 'cv::merge'

这对我来说似乎是正确的。有什么问题,我该如何解决?

【问题讨论】:

zeros1 是什么?在任何地方都看不到它......应该是NameError 您可以从 zeros = np.zeros_like(B) 中受益,它可以让您轻松获得相同的形状和 dtype。 【参考方案1】:

在这一行:

zeros = np.zeros((image.shape[:2]), dtype = 'int8') 

dtype 更改为'uint8'

【讨论】:

【参考方案2】:

这是错误:


zeros = np.zeros((image.shape[:2]), dtype = 'int8')

dtype 应该和图片一样所以uint8.

顺便说一句,我认为您只想显示图像而不关心合并?

然后你可以只用一个通道从灰色到 BGR 的转换:

cv2.imshow("Red", cv2.cvtColor(R, cv2.COLOR_GRAY2BGR))
cv2.imshow("Green", cv2.cvtColor(G, cv2.COLOR_GRAY2BGR))
cv2.imshow("Blue", cv2.cvtColor(B, cv2.COLOR_GRAY2BGR))

【讨论】:

以上是关于如何解决在 Python 中合并 OpenCv 中的频道的问题?的主要内容,如果未能解决你的问题,请参考以下文章

openCV-python(六)图像操作——通道拆分与合并

Python-OpenCV中图像合并显示

Python & OpenCV:如何在无网格表中添加线条

使用 Python 和 OpenCV 合并这两张裁剪皮肤和原始自拍的图像?

OpenCV+python 彩色图像通道拆分与组合并判断size,shape函数的用法与区别

论述在Python程序中如何导入OpenCV以及matplotlib库中的pyplot