使用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
将被复制到输出的通道号3
,1
到1
,2
到2
,通道号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并可视化