首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用OpenCV C++将RGBA转换为RBG

用OpenCV C++将RGBA转换为RBG
EN

Stack Overflow用户
提问于 2022-04-27 08:09:25
回答 1查看 644关注 0票数 0

我很难将RGBA PNG转换为RGB。我使用OpenCV C++加载带有IMREAD_UNCHANGED选项的RGBA,然后将alpha层替换为白色背景。

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

EN

回答 1

Stack Overflow用户

发布于 2022-04-27 08:25:06

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

代码语言:javascript
运行
复制
cv::Mat rgba = cv::imread("some_path", cv::IMREAD_UNCHANGED);
cv::Mat rgb;
cv::cvtColor(rgba, rgb, cv::COLOR_BGRA2BGR);

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

请注意,有两种方法来排序3r,g,b通道: RGB或BGR。opencv中的缺省值是BGR,但两者都支持。只需指定来自enum ColorConversionCodes颜色转换码的适当转换代码即可。

请参阅完整的文档:简历:cvtColor

更新:

在阅读了@ChristophRackwitz的评论之后,我意识到OP可能希望在rgb通道和白色背景之间进行某种混合,这取决于alpha通道。也就是说,像素的α值越接近于0,混合图像中的背景因子就越高。

下面的代码就是这样做的:

代码语言:javascript
运行
复制
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);
    }
}

代码使用ptrcv::Mat方法访问内部数据缓冲区,并对其进行有效更新。rgb_result将包含混合的rgb映像。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72025362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档