[英]Convert RGBA to RBG with OpenCV C++
我很难将 RGBA PNG 转换为 RGB。 我正在使用 OpenCV C++ 加载带有 IMREAD_UNCHANGED 选项的 RGBA PNG,然后我想用白色背景替换 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 可能希望根据 alpha 通道在 rgb 通道和白色背景之间进行某种混合。 即像素的 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::Mat
的ptr
方法访问内部数据缓冲区,并高效地更新它。 rgb_result
将包含混合的 rgb 图像。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.