[Opencv初探之五]:图像通道分离与混合

[Opencv初探之五]:图像通道分离与混合


示例代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
 
using namespace cv;
using namespace std;
 
 
bool MultiChannelBlending();

int main(  )
{
       system("color5E");
 
       if(MultiChannelBlending())
       {
              cout<<endl<<"finish preocess";
       }
       waitKey(0);
       return 0;
}
 

bool MultiChannelBlending()
{
       Mat srcImage;
       Mat logoImage;
       vector<Mat>channels;
       Mat  imageBlueChannel;
 
       //=================【蓝色通道部分】=================

       logoImage=imread("../logo.jpg",0);
       srcImage=imread("../test2.jpg");

 
       //把一个3通道图像转换成3个单通道图像
       split(srcImage,channels);//分离色彩通道
       
       imageBlueChannel=channels.at(0);
       //将原图的蓝色通道的(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)));
 
       //将三个单通道重新合并成一个三通道
       merge(channels,srcImage);
 
       //显示效果图
       namedWindow("blue channel");
       imshow("blue channel",srcImage);
       imwrite("blue.jpg",srcImage);
 
 
       //=================【绿色通道部分】=================
	  Mat  imageGreenChannel;
 
       //重新读入图片
       logoImage=imread("../logo.jpg",0);
       srcImage=imread("../test2.jpg");
       split(srcImage,channels);
       imageGreenChannel=channels.at(1);
       addWeighted(imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,
              logoImage,0.5,0.,imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows)));
        //将三个独立的单通道重新合并成一个三通道
       merge(channels,srcImage);
       namedWindow("green channel");
       imshow("green channel",srcImage);
       imwrite("green.jpg",srcImage);
 
 
 
       //=================【红色通道部分】=================

       Mat  imageRedChannel;
       logoImage=imread("../logo.jpg",0);
       srcImage=imread("../test2.jpg");
 
       split(srcImage,channels);
       imageRedChannel=channels.at(2);
       addWeighted(imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0.,imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)));
       
      merge(channels,srcImage);
 
       //显示效果图
       namedWindow("red channel");
       imshow("red channel",srcImage);
       imwrite("red.jpg",srcImage);
 
       return true;
}

效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值