10_opencv_分离颜色通道、多通道图像混合

发布于:2025-08-01 ⋅ 阅读:(14) ⋅ 点赞:(0)

split() 通道分离

void cv::split(const Mat & 	src,
			   Mat * 	mvbegin )	

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

merge() 通道合并

void cv::merge(InputArrayOfArrays 	mv,
			   OutputArray 	dst )	

在这里插入图片描述
在这里插入图片描述

Mat::at()方法

Mat::at()方法返回一个引用到指定的数组元素。
注意是引用,相当于两者等价,也就是修改其中一个,另一个也会随之改变。

imageBlueChannel= channels.at(0);

imageBlueChannel 变量操作,就是对channels.at[0] 进行操作。

多通道混合-蓝色分量部分

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(   )
{
    //【0】定义相关变量
    Mat srcImage;
    Mat logoImage;
    vector<Mat> channels;
    Mat  imageBlueChannel;

    //=================【蓝色通道部分】=================
    //    描述:多通道混合-蓝色分量部分
    //============================================

    // 【1】读入图片
    logoImage= imread("/Volumes/Macintosh HD - 数据/Code/opencv_code/MyFirstOpenCV01/in_picture/26_dota_logo.jpg",0);
    srcImage= imread("/Volumes/Macintosh HD - 数据/Code/opencv_code/MyFirstOpenCV01/in_picture/dota_jugg.jpg");

    if( !logoImage.data ) { printf("Oh,no,读取logoImage错误~! \n"); return 0; }
    if( !srcImage.data ) { printf("Oh,no,读取srcImage错误~! \n"); return 0; }

    //【2】把一个3通道图像转换成3个单通道图像
    split(srcImage,channels);//分离色彩通道
    
    cout << channels.at(0) << endl;

    //【3】将原图的蓝色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变
    imageBlueChannel= channels.at(0);
    //【4】将原图的蓝色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageBlueChannel中
    addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)),
                1.0,
                logoImage,
                0.5,
                0,
                imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)));

    //【5】将三个单通道重新合并成一个三通道
    merge(channels,srcImage);

    //【6】显示效果图
    namedWindow(" <1>游戏原画+logo蓝色通道");
    imshow(" <1>游戏原画+logo蓝色通道",srcImage);

    waitKey(0);
    return 0;
}

在这里插入图片描述

多通道混合-绿色分量部分

在这里插入图片描述
在这里插入图片描述

多通道混合-红色分量部分

在这里插入图片描述

在这里插入图片描述