OpenCV python:在 BGR 图像中获取通道时 cv2.split() 与切片

Posted

技术标签:

【中文标题】OpenCV python:在 BGR 图像中获取通道时 cv2.split() 与切片【英文标题】:OpenCV python: cv2.split() vs slicing while getting channel in BGR-image 【发布时间】:2012-01-10 19:08:10 【问题描述】:

我只想获取 BGR 图像中的第一个通道(蓝色),然后将其保存到磁盘。 当我使用 cv2.split() 一切正常

>>> import cv2
>>> a = cv2.imread("/home/s18/theVIDEO/1_resized.jpg")
>>> b = cv2.split(a)[0]
>>> type(b)
<type 'numpy.ndarray'>                                                                                              
>>> b                                                                                              
array([[223, 222, 224, ...,  88,  80,  71],
[222, 221, 225, ...,  84,  78,  67],
[220, 221, 225, ...,  77,  71,  62],
..., 
[163, 178, 182, ..., 107, 107, 106],
[148, 170, 186, ..., 104, 104, 103],
[156, 181, 201, ..., 102, 101, 100]], dtype=uint8)
>>> b.shape
(600, 800)
>>> cv2.imwrite("/home/s18/theVIDEO/1_resized2.jpg", b)
True

但是在使用模拟切片操作时出现错误

>>> c = a[:,:,0]
>>> c
>>> type(c)
<type 'numpy.ndarray'>                                                                                              
array([[223, 222, 224, ...,  88,  80,  71],
[222, 221, 225, ...,  84,  78,  67],
[220, 221, 225, ...,  77,  71,  62],
..., 
[163, 178, 182, ..., 107, 107, 106],
[148, 170, 186, ..., 104, 104, 103],
[156, 181, 201, ..., 102, 101, 100]], dtype=uint8)
>>> c.shape
(600, 800)
>>> cv2.imwrite("/home/s18/theVIDEO/1_resized3.jpg", c)
False

数组 b 和 c 中的元素是相等的,维度和类也是相似的。为什么我不能使用简单的切片来获取其中一个频道?

【问题讨论】:

【参考方案1】:

如果你不直接切片而是复制内容,结果是可以的

...
>>> c = zeros((a.shape[0],a.shape[1]), dtype=a.dtype)
>>> c[:,:] = a[:,:,0]
>>> cv2.imwrite('out.jpg', c)
True

【讨论】:

谢谢,它有效。但我不知道,为什么?我认为 c[:,:] = a[:,:,0] 和 c = a[:,:,0] ... 可能是因为 a[:,:,0] 是原始数组数据的引用 >>>b = a[:,:,0] >>>a[0,0,0] 0 >>>b[0,0] = 10 >>>a[0,0,0] 10 python 中的切片运算符返回副本( a = []; id(a) != id(a[:]) ),因此不应引用原始数据。跨度>

以上是关于OpenCV python:在 BGR 图像中获取通道时 cv2.split() 与切片的主要内容,如果未能解决你的问题,请参考以下文章

python使用openCV加载图像并将BGR格式转换成HSV格式定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)并使用mask信息进行颜色分离BGR格式的图像转化为RGB并可视化

python使用openCV加载图像并将BGR格式转换成HSV格式定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)并使用mask信息进行颜色分离BGR格式的图像转化为RGB并可视化

OpenNI RGB 图像到 OpenCV BGR IplImage 的转换?

python-opencv-像素操作

Python OpenCV - imshow 不需要从 BGR 转换为 RGB

[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)