个人资料,仅供学习使用
修改时间——2022年2月13日 10:24:45
学习课程:OpenCV4 C++ 快速入门视频30讲
视频老师:贾志刚

11 通道分离与合并

opencv知识点:

  • 通道分离 - split
  • 通道合并 - merge
  • 通道混合 - mixChannels

本课所解决的问题:

  • 如何分离RGB三通道?
  • 如何合并RGB三通道?
  • 如何对通道进行混合?

1.RGB三通道的解释

彩色图像,是由RGB三个通道合并起来得到的。

如果R,G,B分离,它们就分别对应一个单通道图像(因为都是单通道,所以为灰度图像)
当然,这三个单通道图像再经过合并,就会恢复成原本的彩色图像了

下图中间的R,G,B图,并不是分离,而是3通道中其他两个通道置0了
这时,如果再通过BGR2GRAY转换色彩空间,就可以得到对应的单通道图像

2.通道分离

分离通道要用到split
根据文档,我们有两种分离方式

第一种方式

//函数定义
void channels_demo(Mat& image);//函数实现—
void QuickDemo::channels_demo(Mat& image) {Mat mvt[3];/*第一种方式通过创建图像数组,存储每个单通道图像*/split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("蓝色单通道", mvt[2]);
}

第二种方式

void QuickDemo::channels_demo(Mat& image) {std::vector<Mat> mvt;/*第二种方式通过创建动态数组,存储每个单通道图像*/split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("红色单通道", mvt[2]);
}

分离后得到的结果

3.通道合并

合并通道要用到merge
根据文档,我们有两种合并方式

第一种方式

void QuickDemo::channels_demo(Mat& image) {Mat mvt[3];split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("红色单通道", mvt[2]);Mat dst;merge(mvt,3,dst);/*这里的3指,共有3个单通道图像*/imshow("分离再合并",dst);}

第二种方式

void QuickDemo::channels_demo(Mat& image) {std::vector<Mat> mvt;split(image, mvt);imshow("蓝色单通道", mvt[0]);imshow("绿色单通道", mvt[1]);imshow("红色单通道", mvt[2]);Mat dst;merge(mvt, dst);imshow("分离再合并",dst);}

合并后得到的结果

4.通道混合

通道混合要用到mixChannels

mixChannels混合通道共6个参数第1个参数 输入第2个参数 输入的矩阵数第3个参数 输出第4个参数 输出的矩阵数第5个参数 从哪个通道 变成 哪个通道第6个参数 要变的对数

这里我们进行一个演示,实现如下通道的混合

  • 0通道→2通道
  • 1通道不变
  • 2通道→1通道

这个混合的意思是

  • 0通道的单通道图像,变成了2通道的单通道图像
  • 1通道不变
  • 2通道的单通道图像,变成了0通道的单通道图像

彩色图像本来是bgr的顺序,经过通道混合就变成了rgb

void QuickDemo::channels_demo(Mat& image) {Mat dst = Mat::zeros(image.size(), image.type());int from_to[] = { 0,2,1,1,2,0 };mixChannels(&image, 1, &dst, 1, from_to, 3);imshow("通道混合",dst);
}

混合通道后的结果

本课所用API查阅

split



   char d[] = {1,2,3,4,5,6,7,8,9,10,11,12};Mat m(2, 2, CV_8UC3, d);Mat channels[3];split(m, channels);/*channels[0] =[  1,   4;7,  10]channels[1] =[  2,   5;8,  11]channels[2] =[  3,   6;9,  12]*/


merge


    Mat m1 = (Mat_<uchar>(2,2) << 1,4,7,10);Mat m2 = (Mat_<uchar>(2,2) << 2,5,8,11);Mat m3 = (Mat_<uchar>(2,2) << 3,6,9,12);Mat channels[3] = {m1, m2, m3};Mat m;merge(channels, 3, m);/*m =[  1,   2,   3,   4,   5,   6;7,   8,   9,  10,  11,  12]m.channels() = 3*/

mixChannels


Mat bgra( 100, 100, CV_8UC4, Scalar(255,0,0,255) );
Mat bgr( bgra.rows, bgra.cols, CV_8UC3 );
Mat alpha( bgra.rows, bgra.cols, CV_8UC1 );
// forming an array of matrices is a quite efficient operation,
// because the matrix data is not copied, only the headers
Mat out[] = { bgr, alpha };
// bgra[0] -> bgr[2], bgra[1] -> bgr[1],
// bgra[2] -> bgr[0], bgra[3] -> alpha[0]
int from_to[] = { 0,2, 1,1, 2,0, 3,3 };
mixChannels( &bgra, 1, out, 2, from_to, 4 );



【个人笔记】OpenCV4 C++ 快速入门 11课相关推荐

  1. 【个人笔记】OpenCV4 C++ 快速入门 12课

    个人资料,仅供学习使用 修改时间--2022年2月11日 03:01:50 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 12 图像色彩空间转换 - 进阶 opencv知识点 ...

  2. 【个人笔记】OpenCV4 C++ 快速入门 05课

    个人资料,仅供学习使用 修改时间--2022年2月10日 08:33:18 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 05 图像像素的算术操作 opencv知识点: 图像 ...

  3. 【个人笔记】OpenCV4 C++ 快速入门 04课

    个人资料,仅供学习使用 修改时间--2022年2月7日 11:00:47 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 04 图像像素的读写操作 opencv知识点: 获取/ ...

  4. 【个人笔记】OpenCV4 C++ 快速入门 02课

    个人资料,仅供学习使用 修改时间--2022年2月6日 11:40:46 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 02 图像色彩空间转换 opencv知识点: 色彩空间 ...

  5. 【个人笔记】OpenCV4 C++ 快速入门 00课

    个人资料,仅供学习使用 修改时间--2022年2月5日 11:52:56 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 00 环境配置与搭建 + 显示1张图片 本课解决的问题 ...

  6. 【个人笔记】OpenCV4 C++ 快速入门 29课

    个人资料,仅供学习使用 修改时间--2022年2月19日 15:02:27 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 29 高斯双边模糊 opencv知识点: 高斯双边模 ...

  7. 【个人笔记】OpenCV4 C++ 快速入门 26课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:49:07 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 26 直方图均衡化 opencv知识点: 均衡灰度图 ...

  8. 【个人笔记】OpenCV4 C++ 快速入门 25课

    个人资料,仅供学习使用 修改时间--2022年2月13日 20:45:23 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 25 二维直方图 opencv知识点: 计算直方图数 ...

  9. 【个人笔记】OpenCV4 C++ 快速入门 23课

    个人资料,仅供学习使用 修改时间--2022年1月26日 00:49:43 学习课程:OpenCV4 C++ 快速入门视频30讲 视频老师:贾志刚 23 视频处理与保存 opencv知识点: Vide ...

最新文章

  1. Flash/Flex学习笔记(4):如何打开网页及Get/Post数据
  2. Oracle 重做日志简介
  3. Flex值得一看参考资源
  4. 关于项目进度慢的思考----如何提高整体开发效率
  5. YC元老、硅谷天使投资第一人解读YC成功的秘密
  6. numpy 拼接_数据分析-numpy的拼接与交换
  7. outlook反应慢的原因_保险管怎么区分慢熔和快熔?
  8. Java面试题:高并发环境下,jdk7 HashMap可能出现的致命问题。注意:是在jdk7与及以下版本
  9. 用 Python 爬取了《雪中悍刀行》数据,终于知道它为什么这么火了
  10. 品味ZooKeeper之Watcher机制_2
  11. python调用dos命令_基于Python执行dos命令并获取输出的结果
  12. 错误解决办法:‘NULL’ was not declared in this scope
  13. 聊聊我是如何编程入门的
  14. Visual Studio各组件说明
  15. C++11线程安全的单例模式
  16. 腾讯云人脸识别 活体检测 人员库管理
  17. bluefish中文乱码问题
  18. java sencha_基于SenchaCmd搭建ExtJS 6.2版本开发环境(图文教程)
  19. 服务器排性能行榜,服务器CPU性能排行榜天梯图(双路/三路/四路)
  20. JS前端数据多条件筛选

热门文章

  1. python︱Anaconda安装、简介(安装报错问题解决、Jupyter Notebook)
  2. mod libs 课堂
  3. 彻底理解Java的Future模式
  4. 主键,唯一索引,唯一约束三者之间的联系与区别
  5. oracle asm 错误集
  6. PHP语言中global和$GLOBALS[]的分析(转)
  7. 开源大数据:Alluxio 云原生数据编排
  8. git命令超实用集齐
  9. underscore源码经典--收藏
  10. 让你更好的使用jQuery插件