【问题标题】:Convert 4 channel image to 3 Channel image将 4 通道图像转换为 3 通道图像
【发布时间】:2018-06-05 03:10:12
【问题描述】:

我使用的是 OpenCV 2.4.6。我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像。下面是我的代码。这给出了错误“OpenCV 错误:未知函数中的断言失败”。我认为 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帮助了我。

标签: opencv


【解决方案1】:

常见的假设是第 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 前缀函数。

【讨论】:

  • 我现在正在这样做..但 cv::COLOR_BGRA2HSV 仍然是未定义的 Mat b(mCVImageColor);垫 matHSV(mCVImageColor); cv::cvtColor(b, matHSV, cv::COLOR_BGRA2HSV);
  • 但是我找到了 COLOR_BGRA2BRG。之后我可以做 BGR2HSV。输出是否与 COLOR_BGRA2HSV 相同??
  • 您可以使用直接代码(BGRA ---> HSV)或逐步执行(BFRA ---> BGR ---> HSV)。除了错误,结果将是相同的(OpenCV 忽略 alpha 通道)。
【解决方案2】:

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

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

cvtColor(inputMat, outputMat, CV_BGRA2BGR);

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2018-10-19
      相关资源
      最近更新 更多