将4通道图像转换为3通道图像

时间:2013-09-26 12:51:35

标签: opencv

我正在使用OpenCV 2.4.6。我正在尝试将4通道RGB IplImage转换为4通道HSV图像。以下是我的代码。哪个给出错误“OpenCV错误:断言在未知函数中失败”。我认为cvCvtColor支持3channel图像。有没有办法将4通道RGB转换为HSV或4通道RGB转换为3通道RGB?

 IplImage*  mCVImageColor = cvCreateImageHeader(cvSize(640,480), IPL_DEPTH_8U, 4);
 /*Doing something*/
 IplImage* imgHSV = cvCreateImage(cvGetSize(mCVImageColor), IPL_DEPTH_8U, 4);
 cvCvtColor(mCVImageColor, imgHSV, CV_BGR2HSV); //This line throws exception

3 个答案:

答案 0 :(得分:7)

常见的假设是第4个通道是alpha(A)通道。因此,正确的转换代码是:

cvCvtColor(mCVImageColor, imgHSV, CV_BGRA2HSV);

请注意 BGRA 中的 A

另外,我猜你从语法(mCVImage ...)开始使用C ++。那么,为什么不使用OpenCV的C ++ API呢? 如果您选择使用C ++,文档仍然过时,您可以找到OpenCV 2.4.6 here的最新颜色转换代码。

对于您的情况,正确的颜色转换代码(C ++)是:cv::COLOR_BGRA2HSV。但是,如果您使用的是C ++ API,则应使用cv::Mat个对象并调用函数cv::cvtColor(...),而不是使用IplaImagecv前缀函数。

答案 1 :(得分:4)

使用OpenCV 3.1,我遇到了这个问题,但是sansuiso的答案对我不起作用。

相反,我使用以下命令将4通道颜色(RGBA)转换为3通道颜色(RGB):

cvtColor(inputMat, outputMat, CV_BGRA2BGR);

之后,我验证了每种类型的channels(),并且能够确认Alpha通道已被剥离,并且我的功能正常工作,需要三个通道图像。

答案 2 :(得分:0)

我有想法删除频道,将其转换为白色。然后你可以使用opencv做其他操作。此方法将使用PIL包。

image = Image.open("original.png")
image.convert("RGBA") # Convert this to RGBA if possible

pixel_data = image.load()

if image.mode == "RGBA":
# If the image has an alpha channel, convert it to white
# Otherwise we'll get weird pixels
for y in range(image.size[1]): # For each row ...
    for x in range(image.size[0]): # Iterate through each column ...
        # Check if it's opaque
        if pixel_data[x, y][3] < 255:
            # Replace the pixel data with the colour white
            pixel_data[x, y] = (255, 255, 255, 255)
image.save("noAlphaChannelImage.png")