PIL到OpenCV MAT会导致颜色偏移

时间:2012-07-21 04:10:02

标签: python opencv python-imaging-library

使用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)

如何修复色偏?

3 个答案:

答案 0 :(得分:8)

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:谢谢你指出了这个bug。我上次没时间测试代码了。

希望这有帮助。

答案 1 :(得分:0)

更改

pilImage = Image.open(StringIO(rawImage))

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

答案 2 :(得分:0)

轻炼金术士的回答没有用,但确实解释了这个问题。不会反过来被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