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

7
  • 我想将BGR图像转换为ABGR/ARGB。在opencv中有BGR2RGBA的转换,但没有BGR2ABGR或BGR2ARGB。
  • 使用opencv或其他方法都可以实现吗?

1
您可以使用 BGR2BGRA 转换,然后使用 mixChannels 来重新排列通道。 - sgarizvi
如果我重新排序通道,那么它会正常工作吗? - Sagar
它应该可以正常工作。试一下,看看会发生什么。如果不行,你总可以拆分通道,重新排序并合并。 - sgarizvi
你能给我一些代码示例吗?我已经尝试过,但无法理解其参数。 - Sagar
2个回答

9

通过使用 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格式,因此您将无法显示它们或对其使用某些功能...但是,使用OpenCV的splitmerge函数可以创建它们。以下是一些代码来解释我的意思。
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函数更快地完成(也许只是更短),但我要说,这个函数有点更令人困惑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接