【拜小白opencv】14-只去除RGB的某一颜色通道

来源:互联网 发布:马哲外设淘宝店 编辑:程序博客网 时间:2024/06/06 03:27

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

===========================分割线========================


在前面的内容中,【拜小白opencv】3-彩色图像通道分离与合成;split()与merge() 我们可以实现对三通道图像进行通道的分离,获得单通道图像。本节内容就是利用split()与merge()函数,实现只去除RGB的某一颜色通道,以及只显示一个通道。

=========================分割线====================


演示代码

/*功能:将图像RGB通道分解。以及去除RGB的某一颜色通道。*/#include <opencv2/core/core.hpp>  #include <opencv2/highgui/highgui.hpp>  #include <opencv2/imgproc/imgproc.hpp>  #include <iostream>  using namespace cv;  using namespace std; //-----------------【全局函数声明】---------------------bool MultiChannelBlend();//---------------------【main()函数】-------------------int main(){if (MultiChannelBlend()){cout << "\n运行成功,得出了需要的图像~!" << endl;}waitKey(0);return 0;}//-----------------【MultiChannelBlending()函数】-------------------------//描述:多通道混合的实现函数//------------------------------------------------------------------------bool MultiChannelBlend(){Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\dog8.jpg");imshow("原始图", srcImage);vector<Mat> channels;//vector<Mat>: 可以理解为存放Mat类型的容器(数组) split(srcImage, channels);  //对原图像进行通道分离,即把一个3通道图像转换成为3个单通道图像channels[0],channels[1] ,channels[2]vector<Mat> mbgr(3);//创建类型为Mat,数组长度为3的变量mbgrMat hideChannel(srcImage.size(), CV_8UC1, Scalar(0));//需要隐藏的通道。尺寸与srcImage相同,单通道黑色图像。//注意:0通道为B分量,1通道为G分量,2通道为R分量。因为:RGB色彩空间在opencv中默认通道顺序为BGR!!!//【1】显示彩色的B-蓝色分量。 Mat imageB(srcImage.size(), CV_8UC3);//创建尺寸与srcImage相同,三通道图像imageBmbgr[0] = channels[0];mbgr[1] = hideChannel;mbgr[2] = hideChannel;merge(mbgr, imageB);imshow("imageB-蓝色通道", imageB);//【2】显示彩色的G分量Mat imageG(srcImage.size(), CV_8UC3);//创建尺寸与srcImage相同,三通道图像imageGmbgr[0] = hideChannel;mbgr[1] = channels[1];mbgr[2] = hideChannel;merge(mbgr, imageG);imshow("imageG-绿色通道", imageG);//【3】显示彩色的R分量Mat imageR(srcImage.size(), CV_8UC3);//创建尺寸与srcImage相同,三通道图像imageRmbgr[0] = hideChannel;mbgr[1] = hideChannel;mbgr[2] = channels[2];merge(mbgr, imageR);imshow("imageR-红色通道", imageR);//【4】红和绿混合Mat imageRG(srcImage.size(), CV_8UC3);mbgr[0] = hideChannel;mbgr[1] = channels[1];mbgr[2] = channels[2];merge(mbgr, imageRG);imshow("红色和绿色混合,无蓝", imageRG);//【5】绿色和蓝色混合Mat imageGB(srcImage.size(), CV_8UC3);mbgr[0] = channels[0];mbgr[1] = channels[1];mbgr[2] = hideChannel;merge(mbgr, imageGB);imshow("绿色和蓝色混合,无红", imageGB);//【6】红色和蓝色混合Mat imageRB(srcImage.size(), CV_8UC3);mbgr[0] = channels[0];mbgr[1] = hideChannel;mbgr[2] = channels[2];merge(mbgr, imageRB);imshow("红色和蓝色混合,无绿", imageRB);return true;}
========================分割线=========================


显示结果




==================分割线==================

程序说明

为了便于理解,我将红绿黄三色图也放上去了。
第一行的图像,展示了R、G、B三个单通道图像,以及源图像。
第二行的图像,展示了两两混合的图像。

看过之前文章的同学,可能会发现,这次的图像是彩色的了,而上次的灰白的。那这又是咋回事呢?
答:同学你可以仔细观察,这个程序与前面的程序的差异。上一次是分离后,用单通道显示出来的图像,而这一次是分离后,将某一或两个通道”隐藏“,再进行通道的合并,重新成为三通道显示。因此,本次程序展示出来的图像有颜色。

=====================END================