opencv 在 python 中的工作原理令人困惑。我知道
cv2.imread()
假设图像位于 BGR 中。但是,当我使用 cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
将图像从 BGR 转换为 RGB,并尝试保存图像然后使用 PIL
读取它时,颜色会反转。
上下文:我正在构建一个ROS管道,我必须使用opencv ROS桥来获取图像作为rostopic,然后使用PIL转换图像。
请参考以下代码及输出图片:
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image as im
image1 = cv2.imread('/home/ali/Pictures/rgb.png' )
image2 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
cv2.imwrite('/home/ali/Pictures/test_img_bgr_cv.png', image2)
image3 = im.open('/home/ali/Pictures/test_img_bgr_cv.png')
plt.figure(figsize=(10, 10))
plt.subplot(1, 3, 1), plt.imshow(image1)
plt.title('Image 1'), plt.xticks(\[\]), plt.yticks(\[\])
plt.subplot(1, 3, 2), plt.imshow(image2)
plt.title('Image 2'), plt.xticks(\[\]), plt.yticks(\[\])
plt.subplot(1,3,3), plt.imshow(image3)
plt.title('Image 3'), plt.xticks(\[\]), plt.yticks(\[\])
plt.show()
实际上似乎对
cv2.imread()
存在误解,cv2 以 BGR 格式读取图像,是的,但是当提示保存图像或使用 cv2.imshow
显示图像时,它会正确渲染它们,问题部分出在 matplotlib 中。因为cv2使用BGR颜色格式,而matplotlib使用RGB颜色格式。
所以本质上做的是:
更好的解决方案是删除
image3
,如下所示:
from matplotlib import pyplot as plt
import cv2
image1 = cv2.imread('rgb.png')
image2 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
cv2.imwrite('test_img_bgr_cv.png', image2)
plt.figure(figsize=(10, 10))
plt.subplot(1, 3, 1)
plt.imshow(image1)
plt.title('Image 1')
plt.figure(figsize=(10, 10))
plt.subplot(1, 3, 2)
plt.imshow(image2)
plt.title('Image 1')
plt.show()