使用opencv将图像从BGR转换为ARGB

Posted

技术标签:

【中文标题】使用opencv将图像从BGR转换为ARGB【英文标题】:convert image from BGR to ARGB using opencv 【发布时间】:2016-04-22 07:13:33 【问题描述】: 我想将 BGR 图像转换为 ABGR/ARGB。opencv 中有转换 BGR2RGBA,但没有 BGR2ABGR 或 BGR2ARGB。 是否可以使用 opencv 或任何其他方法?

【问题讨论】:

您可以使用BGR2BGRA 转换后跟mixChannels 重新排序频道。 如果我重新排序频道,它会正常工作吗? 它应该可以正常工作。尝试一下,看看会发生什么。如果它不起作用,您可以随时拆分通道,重新排序并合并。 你能给我一些代码示例吗。我试过但无法理解它的参数。 【参考方案1】:

可以通过使用cv::mixChannels交换图像通道来完成所需的操作,如下所示:

cv::Mat bgr, bgra;

//bgr initialization code here...
//.
//.
//.
cv::cvtColor(bgr, bgra, cv::COLOR_BGR2BGRA);
cv::Mat abgr(bgra.size(), bgra.type());
int from_to[] =  0,3, 1,1, 2,2, 3,0 ;
cv::mixChannels(&bgra,1,&abgr,1,from_to,4);

from_to 数组是映射函数,它指定将来自源的哪些通道复制到目标图像的哪些通道。这些对表示输入的通道号0 将被复制到输出的通道号31122,通道号3 将被复制到输出的通道号0

或者,我们可以拆分图像通道,交换所需通道并再次合并。可以这样做:

cv::cvtColor(bgr, bgra, cv::COLOR_BGR2BGRA);

std::vector<cv::Mat> channels_bgra;
cv::split(bgra, channels_bgra);

std::vector<cv::Mat> channels_abgr =  channels_bgra[3], channels_bgra[1], channels_bgra[2], channels_bgra[0] ;
cv::merge(channels_abgr, abgr);

【讨论】:

【参考方案2】:

OpenCV 不支持 ARGB 或 ABGR 格式,因此您将无法显示它或使用其中的某些功能...但是,可以使用 split 和 merge 函数创建它们的 OpenCV。这是一些代码来解释我的意思。

cv::Mat src, final_image;
// fill src as you prefer
std::vector<cv::Mat> channels;
cv::split(src, channels); // this will put each channel in a mat in the vector

// swap or add channels in the vector
cv::Mat alpha(src.rows, src.cols, CV_8U, cv::Scalar(255));
channels.push_back(alpha);
std::reverse(channels.begin(), channels.end()); //needs <algorithm>

// merge the channels in one new image
cv::merge(channels, final_image); 

这可以通过函数mixChannels 更快地完成(也许会更短),但我会说这个更令人困惑。

【讨论】:

以上是关于使用opencv将图像从BGR转换为ARGB的主要内容,如果未能解决你的问题,请参考以下文章

Python OpenCV - imshow 不需要从 BGR 转换为 RGB

OpenNI RGB 图像到 OpenCV BGR IplImage 的转换?

python使用openCV加载图像并将BGR格式转换成HSV格式定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)并使用mask信息进行颜色分离BGR格式的图像转化为RGB并可视化

python使用openCV加载图像并将BGR格式转换成HSV格式定义HSV格式中需要分离颜色的掩码(掩模)区间(mask)并使用mask信息进行颜色分离BGR格式的图像转化为RGB并可视化

将 OpenCV BGR 8 位图像转换为 CIE L*a*b*

将单通道图像转换为 3 通道图像 C++ / OpenCV