【问题标题】:PIL to OpenCV MAT causes color shiftPIL 到 OpenCV MAT 导致颜色偏移
【发布时间】:2012-07-20 07:43:30
【问题描述】:

使用 PIL 和 OpenCV 加载 png 图像时,会出现颜色偏移。黑色和白色保持不变,但棕色变为蓝色。

我不能发布图片,因为这个网站不允许新手发布图片。

代码写成如下而不是使用cv.LoadImageM,因为在实际情况下,原始图像是通过tcp接收的。

代码如下:

#! /usr/bin/env python
import sys
import cv
import cv2
import numpy as np
import Image
from cStringIO import StringIO

if __name__ == "__main__":
    # load raw image from file
    f = open('frame_in.png', "rb")
    rawImage = f.read()
    f.close()

    #convert to mat
    pilImage = Image.open(StringIO(rawImage));
    npImage = np.array(pilImage)
    cvImage = cv.fromarray(npImage)

    #show it
    cv.NamedWindow('display')
    cv.MoveWindow('display', 10, 10)
    cv.ShowImage('display', cvImage)
    cv. WaitKey(0)

    cv.SaveImage('frame_out.png', cvImage)

如何修复颜色偏移?

【问题讨论】:

    标签: python opencv python-imaging-library


    【解决方案1】:

    OpenCV 的图像具有按 BGR 顺序排列的颜色通道,而 PIL 是 RGB。您需要像这样切换频道:

    import PIL.Image
    import cv2
    
    ... 
    
    image = np.array(pilImage) # Convert PIL Image to numpy/OpenCV image representation
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # You can use cv2.COLOR_RGBA2BGRA if you are sure you have an alpha channel. You will only have alpha channel if your image format supports transparency.
    ...
    

    @Krish:感谢您指出错误。上次没来得及测试代码。

    希望这会有所帮助。

    【讨论】:

    • 元组没有reverse()函数!!
    • @Krish:修复了你提到的错误。谢谢。
    【解决方案2】:

    光之炼金术士的回答没有用,但确实说明了问题。反向不会被 Apha 通道搞砸,即它将 BRGA 更改为 AGRB。我认为 Froyo 的回答会解决它,但它根本没有改变显示的图像。起作用的是反转 OpenCV 中的颜色。我太新手了,不知道为什么。他们似乎和我一样。最好在 numpy 中反转颜色,因为在 numpy 中计划了额外的处理。但是感谢您的帮助,这些答案将我引向了正确的方向。

    pilImage = Image.open(StringIO(rawImage));
    bgrImage = np.array(pilImage)
    cvBgrImage = cv.fromarray(bgrImage)
    
    # Reverse BGR
    cvRgbImage = cv.CreateImage(cv.GetSize(cvBgrImage),8,3)
    cv.CvtColor(cvBgrImage, cvRgbImage, cv.CV_BGR2RGB)
    
    #show it
    cv.ShowImage('display', cvRgbImage)
    cv. WaitKey(30)    # ms to allow display
    

    【讨论】:

      【解决方案3】:

      改变

      pilImage = Image.open(StringIO(rawImage))
      

      pilImage = Image.open(StringIO(rawImage)).convert("RGB")
      

      【讨论】:

        猜你喜欢
        • 2016-11-04
        • 1970-01-01
        • 2018-07-15
        • 2014-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多