代码之家  ›  专栏  ›  技术社区  ›  gabbar0x

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

  •  116
  • gabbar0x  · 技术社区  · 9 年前

    我将在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

    6 回复  |  直到 8 年前
        1
  •  10
  •   Alexander Mathiasen    5 年前

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

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

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

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

        2
  •  1
  •   Jaied    5 年前

    作为前一个答案的替代,您可以使用(稍快)

    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个回路)

        3
  •  1
  •   BV2K    5 年前

    简单的单线解决方案

    np.flip(img, axis=-1) 
    

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

        4
  •  1
  •   Salvatore Pannozzo Capodiferro    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()
    

    输出: enter image description here