mixChannels()函数的理解
mixChannels()是图像通道处理有关的一个函数,能够实现复杂通道的组合
1. 函数原型
1.1 函数原型(一)
void cv::mixChannels (
InputArrayOfArrays src,
InputOutputArrayOfArrays dst,
const std::vector< int > & fromTo
)
第一个参数:输入矩阵
第二个参数:输出矩阵
第三个参数:复制列表,表示第输入矩阵的第几个通道复制到输出矩阵的第几个通道
比如 {0,2,1,1,2,0}表示:
src颜色通道0复制到dst颜色通道2
src颜色通道1复制到dst颜色通道1
src颜色通道2复制到dst颜色通道0
如图:
这里需要注意的是,输入矩阵和输出矩阵的结构必须是预先定义好的。
1.2 函数原型(二)
void cv::mixChannels
(
const Mat * src,
size_t nsrcs,
Mat * dst,
size_t ndsts,
const int * fromTo,
size_t npairs
)
第一个参数:输入矩阵
第二个参数:输入矩阵的数量
第三个参数:输出矩阵
第四个参数:输出矩阵的数量
第五个参数:复制列表
第六个参数:复制列表的数量
在这个函数原型中,如果输入矩阵和输出矩阵都写1,那么就跟第一种函数原型是一致的了。
如果不为1,就可以实现多个矩阵组合并或者一个矩阵拆分为多个复杂矩阵等功能。
2. 举例说明
2.1 颜色通道交换
这里就使用第一个函数原型进行举例介绍,自定义了一个三通道矩阵,并且把通道0和2进行了交换
Mat m(500, 500, CV_8UC3, Scalar(255, 255, 0));
Mat m2(500, 500, CV_8UC3);
vector<Mat> channels;
split(m, channels);
imshow("m", m);
imshow("0", channels.at(0));
imshow("1", channels.at(1));
imshow("2", channels.at(2));
vector<int> fromTo = {0,2,1,1,2,0};
mixChannels(m, m2, fromTo);
vector<Mat> channels2;
split(m2, channels2);
imshow("/m", m2);
imshow("/0", channels2.at(0));
imshow("/1", channels2.at(1));
imshow("/2", channels2.at(2));
waitKey(0);
交换前:
交换后:
2.2 四通道矩阵分割
把一个四通道矩阵,使用mixChannels()函数分割成了一个三通道矩阵和一个单通道矩阵,并且具有对应关系:
// bgra[0] -> bgr[2], bgra[1] -> bgr[1],
// bgra[2] -> bgr[0], bgra[3] -> alpha[0]
Mat bgra(500, 500, CV_8UC4, Scalar(255, 0, 0, 255));
Mat bgr(bgra.rows, bgra.cols, CV_8UC3);
Mat alpha(bgra.rows, bgra.cols, CV_8UC1);
Mat out[] = { bgr,alpha };
int fromTo[] = { 0, 2, 1, 1, 2, 0, 3, 3 };
mixChannels(&bgra, 1, out, 2, fromTo, 4);
imshow("bgra", bgra);
imshow("bgr", bgr);
imshow("alpha", alpha);
运行结果:
参考文献
[1] opencv mixChannels()详解:4通道图像分割、HSV通道获取 http://www.pianshen.com/article/4148149685/