使用opencvc++将RGBA转换为RBG



我在将RGBA PNG转换为RGB时有困难。我使用OpenCV c++加载RGBA PNG与IMREAD_UNCHANGED选项,然后我想用白色背景替换alpha层。

如有任何提示,我将不胜感激。

您可以使用cv::cvtColor更改像素格式:

cv::Mat rgba = cv::imread("some_path", cv::IMREAD_UNCHANGED);
cv::Mat rgb;
cv::cvtColor(rgba, rgb, cv::COLOR_BGRA2BGR);

rgb将是一个没有alpha通道的3通道rgb图像。

请注意,有两种方式对3个r,g,b通道进行排序:RGB或BGR。opencv的默认值是BGR,但它两者都支持。只需从enum ColorConversionCodes中指定适当的转换代码:颜色转换代码。

查看完整的文档:cv::cvtColor

更新:

在阅读了@ChristophRackwitz的评论后,我意识到OP可能想要在rgb通道和白色背景之间做一些混合,这取决于alpha通道。也就是说,像素的alpha值越接近于0,混合中背景的因子越高。

下面的代码是这样做的:

cv::Mat rgba = cv::imread("image_path", cv::IMREAD_UNCHANGED);
cv::Mat rgb_result(rgba.size(), CV_8UC3);
for (int y = 0; y < rgba.rows; ++y)
{
auto const * rgba_pLine = rgba.ptr<cv::Vec4b>(y);
auto * rbg_result_pLine = rgb_result.ptr<cv::Vec3b>(y);
for (int x = 0; x < rgba.cols; ++x)
{
auto const & rgba_pixel = rgba_pLine[x];
auto & rgb_result_pixel = rbg_result_pLine[x];
float alpha0to1 = rgba_pixel[3] / 255.f;
rgb_result_pixel[0] = static_cast<uchar>(alpha0to1 * rgba_pixel[0] + (1 - alpha0to1) * 255);
rgb_result_pixel[1] = static_cast<uchar>(alpha0to1 * rgba_pixel[1] + (1 - alpha0to1) * 255);
rgb_result_pixel[2] = static_cast<uchar>(alpha0to1 * rgba_pixel[2] + (1 - alpha0to1) * 255);
}
}

代码使用cv::Matptr方法访问内部数据缓冲区,并有效地更新它。rgb_result将包含混合rgb图像。

最新更新