openCV学习笔记-颜色通道的分离和混合

来源:互联网 发布:js base64 编辑:程序博客网 时间:2024/06/05 00:23
  1. 颜色通道
    保存图像颜色信息的通道称为颜色通道。
  2. RGB color有合成意义的变化(color channel),就是人有合成意义地(只用肢体或使用工具)将红蓝绿三种(实色料或颜色)合成出(一个或多个实色料空间显示、阻挡显示、隐藏、消失,从合成后可以赋予意义、认为无意义、没有赋予的意义、没有发现的意义、没有认同的意义等多种意义;一种颜色或多种颜色显示、阻挡显示、隐藏、消失,从合成后可以赋予意义、认为无意义、没有赋予的意义、没有发现的意义、没有认同的意义等多种意义)。RGB color有合成意义的变化,可以加大空间或增添颜色,两者皆可一起。
  3. split
    CV_EXPORTS void split(const Mat& m, vector<Mat>& mv );
    分离图片的颜色通道,把一张多通道的图片m分离成多个单通道的图片存在数组mv里面
  4. merge
    CV_EXPORTS void merge(const vector<Mat>& mv, OutputArray dst );
    与split的操作相反。把多张单通道的图片集合mv合成到一张多通道的图片m
    #include<opencv2/opencv.hpp>#include<opencv2/highgui/highgui.hpp>#include<iostream>using namespace cv;using namespace std;//函数声明bool MultiChannelBlending();//颜色通道混合/*==========  主函数==========*/int main(int argc, char** argv){MultiChannelBlending();waitKey(0);return 0;}bool MultiChannelBlending(){//【0】定义相关变量Mat srcImage;//原图Mat logoImage;//logovector<Mat>channels;//用来存储分离后的通道分量//=====蓝色通道部分===========================Mat imageBlueChannel;//存储蓝色通道分量//【1】读入图片logoImage = imread("logo.jpg",0);//注意是灰度图srcImage = imread("boy.jpg");if (logoImage.empty()){cout<<"读取logo错误!"<<endl;return false;}if (srcImage.empty()){cout<<"读取srcImage错误!"<<endl;return false;}//【2】分离通道,将一张三通道的图片转化成3张单通道图片split(srcImage, channels);//【3】存取蓝色通道部分,这里的赋值是引用,相当于两者等价imageBlueChannel = channels.at(0);//【4】线性混合,将原图的蓝色通道坐标(50,50)左下方矩形区域进行混合addWeighted(imageBlueChannel(Rect(50,50,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0,imageBlueChannel(Rect(50,50,logoImage.cols,logoImage.rows)));//【5】重新合成三通道merge(channels, srcImage);//【6】显示图片namedWindow("boy+bluelogo");imshow("boy+bluelogo",srcImage);//=========绿色通道部分==================Mat imageGreenChannel;//【1】读入图片srcImage = imread("boy.jpg");logoImage = imread("logo.jpg",0);//灰度if (srcImage.empty()){cout<<"读取srcImage错误!"<<endl;return false;}if (logoImage.empty()){cout<<"读取logo错误!"<<endl;return false;}//【2】分离通道split(srcImage, channels);//【3】存储绿色通道分量imageGreenChannel = channels.at(1);//【4】线性混合addWeighted(imageGreenChannel(Rect(50,50,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0.0,imageGreenChannel(Rect(50,50,logoImage.cols,logoImage.rows)));//【5】重新合成merge(channels, srcImage);//【6】显示namedWindow("boy+greenlogo");imshow("boy+greenlogo",srcImage);//=========红色通道部分==================Mat imageRedChannel;//【1】读入图片srcImage = imread("boy.jpg");logoImage = imread("logo.jpg",0);//灰度if (srcImage.empty()){cout<<"读取srcImage错误!"<<endl;return false;}if (logoImage.empty()){cout<<"读取logo错误!"<<endl;return false;}//【2】分离通道split(srcImage, channels);//【3】存储绿色通道分量imageRedChannel = channels.at(2);//【4】线性混合addWeighted(imageRedChannel(Rect(50,50,logoImage.cols,logoImage.rows)),1.0,logoImage,0.5,0.0,imageRedChannel(Rect(50,50,logoImage.cols,logoImage.rows)));//【5】重新合成merge(channels, srcImage);//【6】显示namedWindow("boy+redlogo");imshow("boy+redlogo",srcImage);return true;}




0 0
原创粉丝点击