OpenCV 在加载时给彩色图像添加错误的颜色

我正在用 PythonOpenCV 加载一个彩色图像并绘制相同的图像。然而,我得到的图像有它的颜色都混合在一起。

密码如下:

import cv2
import numpy as np
from numpy import array, arange, uint8
from matplotlib import pyplot as plt




img = cv2.imread('lena_caption.png', cv2.IMREAD_COLOR)
bw_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


images = []
images.append(img)
images.append(bw_img)


titles = ['Original Image','BW Image']


for i in xrange(len(images)):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])


plt.show()

Here is the original image: enter image description here

这是图片: enter image description here

113428 次浏览

OpenCV uses BGR as its default colour order for images, matplotlib uses RGB. When you display an image loaded with OpenCv in matplotlib the channels will be back to front.

解决这个问题的最简单方法是使用 OpenCV 显式地将其转换回 RGB,就像您在创建灰度图像时所做的那样。

RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

And then use that in your plot.

As an alternative to the previous answer, you can use (slightly faster)

img = cv2.imread('lena_caption.png')[...,::-1]

%timeit [cv2.cvtColor(cv2.imread(f), cv2.COLOR_BGR2RGB) for f in files]
每个循环231ms ± 3.08 ms (平均值 ± std. dev,7次运行,每次循环1次)

%timeit [cv2.imread(f)[...,::-1] for f in files]
每个循环220ms ± 1.81 ms (平均值 ± std. dev,7次运行,每次循环1次)

如果您尝试使用 OpenCV 读取图像,它将使用 BGR 作为默认值。因此,你必须使用不同的方法来阅读图像。我已经对您的代码进行了必要的更改,以获得所需的输出已在下面给出。

import cv2
import numpy as np
from numpy import array, arange, uint8
from matplotlib import pyplot as plt




img = cv2.cvtColor(cv2.imread('lena_caption.png'), cv2.COLOR_BGR2RGB)
bw_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


images = []
images.append(img)
images.append(bw_img)


titles = ['Original Image','BW Image']


for i in xrange(len(images)):
plt.subplot(1,2,i+1),plt.imshow(images[i],'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])


plt.show()

产出: enter image description here

简单的一行解决方案

np.flip(img, axis=-1)

这可以转换两种方式。从 RGB 到 BGR,从 BGR 到 RGB。

你也可以试试 cv2.IMREAD _ UNCHANGED ():

https://www.geeksforgeeks.org/python-opencv-cv2-imread-method/

读取图像后,通过从右向左读取矩阵,将 bgr 矩阵的顺序还原为 rgb:

x = cv2.imread('./image.jpg')


x=x[:,:,::-1]


plt.imshow(x)