我很难将RGBA PNG转换为RGB。我使用OpenCV C++加载带有IMREAD_UNCHANGED选项的RGBA,然后将alpha层替换为白色背景。
如果有任何提示,我将不胜感激。
发布于 2022-04-27 08:25:06
您可以使用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图像。
请注意,有两种方法来排序3r,g,b通道: RGB或BGR。opencv中的缺省值是BGR,但两者都支持。只需指定来自enum ColorConversionCodes
:颜色转换码的适当转换代码即可。
请参阅完整的文档:简历:cvtColor
更新:
在阅读了@ChristophRackwitz的评论之后,我意识到OP可能希望在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);
}
}
代码使用ptr
的cv::Mat
方法访问内部数据缓冲区,并对其进行有效更新。rgb_result
将包含混合的rgb映像。
https://stackoverflow.com/questions/72025362
复制相似问题