OpenCV在加载彩色图像时会出现颜色错误

129

我正在使用Python OpenCV加载一张彩色图像并绘制它。然而,我得到的图像颜色混乱。

以下是代码:

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()

这是原始图像: 在此输入图片描述

这是绘制的图像: 在此输入图片描述

7个回答

250

OpenCV默认使用BGR作为图像的颜色顺序,而matplotlib使用RGB。当您在matplotlib中显示使用OpenCv加载的图像时,通道将会反过来。

最简单的解决方法是使用OpenCV将其明确地转换回RGB,就像创建灰度图像时所做的那样。

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

然后在您的图表中使用它。


16
当您读取文件时,也可以在一行中使用它:img = cv2.imread('lena_caption.png', cv2.COLOR_BGR2RGB) - Spiral Out
7
@SpiralOut,这个似乎不再起作用了;文档中也没有提到COLOR_BGR2RGB作为可能的标志。https://docs.opencv.org/3.4/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80 - Alexander Chebykin
1
确认了,对图像使用cvtColor能够解决我的问题,而直接在imread函数中传递参数不能够修复该问题。 - Salvatore Pannozzo Capodiferro
有没有聪明的方法来确保它是RGB图像,而不是CV位图图像?似乎这会在CV位图图像上引发错误。 - mochsner
默认使用哪种颜色模式?我正在使用JavaScript。我知道对于Python来说是BGR,但是对于JS呢? - AgentNirmites

28
作为先前答案的替代方案,您可以使用(稍微更快):
img = cv2.imread('lena_caption.png')[...,::-1]
%timeit [cv2.cvtColor(cv2.imread(f), cv2.COLOR_BGR2RGB) for f in files] 231毫秒±3.08毫秒每个循环(7次运行的平均值±标准差,每个循环1次)
%timeit [cv2.imread(f)[...,::-1] for f in files] 220毫秒±1.81毫秒每个循环(7次运行的平均值±标准差,每个循环1次)

9
不行。原因在这里:https://answers.opencv.org/question/219040/fastest-way-to-convert-bgr-rgb-aka-do-not-use-numpy-magic-tricks/ - baldr
2
你能否请详细解释一下 RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 与之前的代码有何不同之处? - Avinash Singh
@AvinashSingh。BGR表示0维是蓝色,1维是绿色,2维是红色,但RGB是红绿蓝,顺序相反。 - Demetry Pascal

16

简单的一行解决方案

np.flip(img, axis=-1) 

这可以双向转换。从RGB到BGR,也可以从BGR到RGB。


3

如果您在 PyCharm 的暗模式下使用,您会发现从 BGR 到 RGB 的更改是不够的。这是因为 PyCharm 有一个名为 "Invert image outputs for dark themes" 的设置。

禁用首选项 | 语言和框架 | Jupyter | 反转图像输出以适应暗色主题应该会有所帮助。

反转图像已开启: Invert image is ON

反转图像已关闭: Invert image is OFF

请注意,两个示例中的代码是相同的,只有 PyCharm 中的设置不同。


2

在读取图像后,通过从右到左读取矩阵来将BGR矩阵的顺序反转为RGB:

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

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

plt.imshow(x)

1

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


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