OpenCV在加载时为彩色图像提供错误的颜色

Posted

技术标签:

【中文标题】OpenCV在加载时为彩色图像提供错误的颜色【英文标题】:OpenCV giving wrong color to colored images on loading 【发布时间】:2017-01-11 23:44:48 【问题描述】:

我正在 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()

这是原图:

这是绘制的图像:

【问题讨论】:

【参考方案1】:

OpenCV 使用 BGR 作为图像的默认颜色顺序,matplotlib 使用 RGB。当您在 matplotlib 中显示使用 OpenCv 加载的图像时,通道将返回到前面。

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

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

然后在你的情节中使用它。

【讨论】:

阅读文件时也可以一行使用img = cv2.imread('lena_caption.png', cv2.COLOR_BGR2RGB) @SpiralOut 这似乎不再起作用了;文档也没有提到 COLOR_BGR2RGB 作为可能的标志docs.opencv.org/3.4/d8/d6a/… 已确认,在图像上使用 cvtColor 对我有用,而直接在 imread 函数上传递参数并不能解决问题【参考方案2】:

作为上一个答案的替代方案,您可以使用(稍微快一点)

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 个循环)

【讨论】:

没有。这就是为什么:answers.opencv.org/question/219040/… 你能解释一下它与RGB_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)的不同之处 @AvinashSingh。 BGR表示0维是蓝色,1-绿色,2-红色,而RGB是红绿蓝,倒序【参考方案3】:

简单的单线解决方案

np.flip(img, axis=-1) 

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

【讨论】:

很漂亮!【参考方案4】:

如果您尝试使用 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()

输出:

【讨论】:

【参考方案5】:

您可能还想尝试 cv2.IMREAD_UNCHANGED()。在此处查看更多内容以了解它与 IMREAD_COLOR 有何不同:

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

【讨论】:

【参考方案6】:

读取图像后,通过从右到左读取矩阵,将 bgr 矩阵的顺序恢复为 rgb:

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

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

plt.imshow(x)

【讨论】:

以上是关于OpenCV在加载时为彩色图像提供错误的颜色的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 例程200篇209. HSV 颜色空间的彩色图像分割

youcans 的 OpenCV 学习课12. 彩色图像的处理

youcans 的 OpenCV 学习课12. 彩色图像的处理

OpenCV-Python教程:颜色图(applyColorMap)[只需几行代码生成22种风格各异的彩色图]

python使用OpenCV加载彩色图像并把图像转化为YUV格式的彩色图使用equalizeHist算法增强彩色图像的对比度可视化对比度增强之后的彩色图像

如何使用opencv从图像中删除小的彩色像素