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

10

我正在使用OpenCV 2.4.6。我试图将4通道RGB IplImage转换为4通道HSV图像。以下是我的代码。它会出现错误信息“OpenCV Error: Assertion failed in unknown function”。我认为cvCvtColor只支持3通道图像,有没有办法将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

数组操作mixChannels对我很有帮助。 - Duncan Calvert
3个回答

11

普遍认为第4个通道是阿尔法(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(...),而不是使用IplaImage和带有cv前缀的函数。


1
我现在正在做这个...但是cv :: COLOR_BGRA2HSV仍未定义。Mat b(mCVImageColor); Mat matHSV(mCVImageColor); cv :: cvtColor(b,matHSV,cv :: COLOR_BGRA2HSV); - Tonmoy
但我发现了COLOR_BGRA2BRG。在此之后,我可以进行BGR2HSV。输出结果是否与COLOR_BGRA2HSV相同? - Tonmoy
你可以直接使用代码(BGRA ---> HSV)或者通过步骤(BFRA ---> BGR ---> HSV)来实现。除了错误之外,结果将是相同的(OpenCV忽略alpha通道)。 - sansuiso

7
使用OpenCV 3.1,我遇到了这个问题,但是sansuiso的答案对我没有用。相反,我使用了以下命令将4通道颜色(RGBA)转换为3通道颜色(RGB):
cvtColor(inputMat, outputMat, CV_BGRA2BGR);

之后,我验证了每个类型的channels(),并确认了透明通道已被剥离,我的函数需要三个通道图像才能正常工作。


-2

我有一个想法,可以将通道移除并转换为白色。然后您可以使用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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接