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

时间:2016-09-04 11:31:19

标签: python image opencv colors rgb

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

这是原始图片: enter image description here

这是绘制的图像: enter image description here

5 个答案:

答案 0 :(得分:87)

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

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

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

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

答案 1 :(得分:7)

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

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

%timeit [cv2.cvtColor(cv2.imread(f), cv2.COLOR_BGR2RGB) for f in files]
每个循环231 ms±3.08 ms (平均±标准偏差,共运行7次,每个循环1次)

%timeit [cv2.imread(f)[...,::-1] for f in files]
每个循环220 ms±1.81 ms (平均±标准偏差,共运行7次,每个循环1次)

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

简单的一行解决方案

np.flip(img, axis=-1) 

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