我在交换图像的通道(特别是红色和蓝色通道)时遇到了一点问题。我正在使用Opencv 3.0.0和Python 2.7.12。下面是我交换通道的代码
import cv2
img = cv2.imread("input/car1.jpg")
#The obvious approach
Cimg = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#Manual Approach
red = img[:,:,2]
blue = img[:,:,0]
img[:,:,0] = red
img[:,:,2] = blue
cv2.imshow("frame",Cimg)
cv2.imshow("frame2", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我无法理解为什么同一个图像经过相同(可能)的操作会产生两种不同的输出。有人能告诉我们出了什么问题吗
red
和blue
只是图像的视图。当您执行img[:,:,0] = red
时,这会更改img
但也会更改blue
,它只是一个视图(基本上只是对子数组的引用img[:,:,0]
),而不是副本,因此您会丢失原始的蓝色通道值。基本上,你假设的是临时副本,其实不然。添加.copy()
它就会工作结果:
随附副本:
无副本:
注意:您实际上只需要1个通道的1个临时副本。 或者您也可以简单地执行
img[:,:,::-1]
这将再次创建一个视图,但对于交换的通道,img
将保持不变,除非您重新指定它:结果:
相关问题 更多 >
编程相关推荐