• C++ opencv 通道分离与合并


    1.RGB三通道的解释


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

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

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

    在这里插入图片描述

    2.通道分离实现

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

    split函数用于将一个多通道数组分离成几个单通道数组。

    split函数的C++版本有两个原型,分别是:

    void split(const Mat& src, Mat*mvbegin);
    void split(InputArray m, OutputArrayOfArrays mv);
    参数含义如下:

    第一个参数:InputArray m(const Mat& src),填我们需要进行分离的多通道数组。

    第二个参数:OutputArrayOfArrays mv,填函数的输出数组或者输出的vector容器。

     split函数分割多通道数组转换成独立的单通道数组,公式如下:

                                                                          

    第一种方式

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

    第二种方式

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


    3.通道合并

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

    API

    merge()函数是将多个数组合并成一个多通道的数组。将一些孤立的单通道数组合并成一个多通道数组,创建一个由多个单通道阵列组成的多通道阵列。

    merge()函数的C++有两个版本:

    void merge(const Mat& mv, size_tcount, OutputArray dst);
    void merge(InputArrayOfArray mv, OutputArray dst);
    参数说明:

    第一个参数:const Mat& mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。

    第二个参数:size_tcount,当mv为一个空白的C数组时,代表输入矩阵的个数,必须大于1。

    第三个参数:dst,输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。
     

    第一种方式

    1. void QuickDemo::channels_demo(Mat& image) {
    2.     Mat mvt[3];
    3.     
    4.     split(image, mvt);
    5.     imshow("蓝色单通道", mvt[0]);
    6.     imshow("绿色单通道", mvt[1]);
    7.     imshow("红色单通道", mvt[2]);
    8.     Mat dst;
    9.     
    10.     merge(mvt,3,dst);
    11.     /*
    12.     这里的3指,共有3个单通道图像
    13.     */
    14.     imshow("分离再合并",dst);
    15. }



    第二种方式

    1. void QuickDemo::channels_demo(Mat& image) {
    2.     std::vector mvt;
    3.     split(image, mvt);
    4.     imshow("蓝色单通道", mvt[0]);
    5.     imshow("绿色单通道", mvt[1]);
    6.     imshow("红色单通道", mvt[2]);
    7.     Mat dst;
    8.     merge(mvt, dst);
    9.     imshow("分离再合并",dst);
    10. }

      也可以单独把一个通道关闭

    1. std::vector mvt;
    2. Mat dst = Mat::zeros(srcImage.size(), srcImage.type());//养成习惯
    3. //imshow("windows", srcImage);
    4. split(srcImage, mvt);
    5. mvt[0]=0;
    6. merge(mvt,dst);
    7. imshow("com",dst);

    4.通道混合

    API

    mixChannels

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



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

    0通道→2通道
    1通道不变
    2通道→1通道
    这个混合的意思是,彩色图像本来是bgr的顺序,经过通道混合就变成了rgb。

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

    实例代码

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

    在这里插入图片描述

  • 相关阅读:
    LeetCode【84】柱状图中的最大矩形
    line-height用了这么久,你真的了解他么
    1.物联网射频识别,RFID概念、组成、中间件、标准,全球物品编码——EPC码
    Impala字符串截取left、right、substr/substring
    JDK,JRE和JVM三者间关系
    Python之字符串分割替换移除
    Zookeeper:事件监听和通知机制
    HarmonyOS hsp制作与引用
    函数式编程Haskell初探
    keycloak~对接login-status-iframe页面判断用户状态变更
  • 原文地址:https://blog.csdn.net/weixin_46098612/article/details/127782238