我在交换图像的频道(特别是红色和蓝色)时遇到了一点问题。我正在使用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()
就可以了。结果:
带副本:
无副本:
注意:你实际上只需要一个通道的临时副本。 或者您也可以简单地执行
img[:,:,::-1]
这将再次创建一个视图,但是使用交换的通道,img
将保持不变,除非您重新分配它:结果:
相关问题 更多 >
编程相关推荐