2012-07-21 118 views
4

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

我无法发布图片,因为本网站不允许新手发布图片。

代码的写法如下,而不是使用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) 

如何色偏能解决吗?

回答

0

变化

pilImage = Image.open(StringIO(rawImage)) 

pilImage = Image.open(StringIO(rawImage)).convert("RGB") 
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:谢谢你指出错误。上次我没有时间测试代码。

希望这会有所帮助。

+0

元组没有reverse()函数!! – Krish 2012-10-16 23:57:17

+0

@Krish:修正了你提到的错误。谢谢。 – lightalchemist 2012-10-17 02:57:12

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