OpenCV python:使用cv2.split()与在BGR图像中获取通道时的切片有什么区别?

5

我想从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个回答

2
如果您不直接对文本进行切片,而是复制内容,则结果会正常。
...
>>> 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] 之间有什么区别... - s18
可能是因为a[:,:,0]是原始数组数据的引用 >>>b = a[:,:,0] >>>a[0,0,0] 0 >>>b[0,0] = 10 >>>a[0,0,0] 10 - Peb
在Python中,切片操作符返回副本(a = []; id(a)!= id(a[:])),因此不应该引用原始数据。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接