4

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

如何修复颜色偏移?

4

3 回答 3

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:感谢您指出错误。上次我没有时间测试代码。

希望这可以帮助。

于 2012-07-21T08:04:36.740 回答
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
于 2012-07-23T03:26:28.757 回答
0

改变

pilImage = Image.open(StringIO(rawImage))

pilImage = Image.open(StringIO(rawImage)).convert("RGB")
于 2012-07-21T05:54:36.187 回答