通道分离与合并

1.RGB三通道的解释


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

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

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

通道分离与合并_第1张图片

 

2.通道分离实现


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

第一种方式3

//函数定义
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 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 mvt;

    split(image, mvt);

    imshow("蓝色单通道", mvt[0]);
    imshow("绿色单通道", mvt[1]);
    imshow("红色单通道", mvt[2]);

    Mat dst;

    merge(mvt, dst);

    imshow("分离再合并",dst);

}

4.通道混合

API

mixChannels


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



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

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

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

实例代码

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);
}

通道分离与合并_第2张图片

 

你可能感兴趣的:(C++,opencv,计算机视觉,深度学习,人工智能)