OpenCV學習心得(5) -- 圖像通道分離

原创 2012年03月21日 19:18:59

轉載請注明出處與作者

OpenCV提供了一個函數可以進行通道的分離,就是 cv::split.

void split(const Mat& mtx, vector<Mat>& mv);

void split(const Mat& mtx, Mat* mv);

這個函數的第二個參數是一個std::vector容器.

需要注意的是此容器必須要預先預留空間,否則會出現內存洩露問題.

例如

//std::vector<cv::Mat> mv; //這是錯誤的.因為這樣定義的vector並沒申請Mat空間.

可以使用下面的方式申請:

std::vector<cv::Mat> mv(3); 

也可以使用下面的方式:

std::vector<cv::Mat> mv;

mv.push_back(cv::Mat());

mv.push_back(cv::Mat());

mv.push_back(cv::Mat());

cv::split(src,mv);


cv::split的另一個重載形式是使用一個預先申請好的Mat數組,將數組的頭指針傳進第二個參數.


下面是類中的代碼:

//!分離一個通道,如果要求的通道index無效則返回false. filltype為設置預設調色板填充類型,為NULL為不設置.此函數不改變ROI.此函數針對整個圖片進行處理
	bool SplitChannel(int channel_index,RGBQUAD_FILLTYPE *filltype=NULL);
bool COpenCVImage::SplitChannel(int channel_index,RGBQUAD_FILLTYPE *filltype)
{
	if(m_src.channels()<=channel_index) return false;
	std::vector<cv::Mat> mv(m_src.channels());
	cv::split(m_src,mv);
	m_src=mv[channel_index];
	if(filltype)
	{
		m_rgbQuad_filltype=*filltype;
	}
	m_modifyed_for_draw=true;
	return true;
}

看到其他論壇上有人問通道分離后使用CvvImage類顯示的時候都是灰度圖..這很正常的..因為CvvImage類中顯示單channel圖像的時候在調色板中填充的就是0~255的灰度值.顯示的當然是灰度圖像啦..

我在這個類中有做一些改變.也就是建立了一個RGBQUAD_FILLTYPE m_rgbQuad_filltype的成員變量,當顯示的時候,在填充調色板的時候會根據這個值來確定調色板中是填充什麽樣的顏色.只有5個顏色可選,灰度,紅,綠,藍,黑白.

例如:當分離一個3通道的BGR圖像的Blue通道的時候可以這樣做:

RGBQUAD_FILLTYPE tmp_type;

tmp_type=RGBQUAD_FILLTYPE_BLUE;

SplitChannel(0,tmp_type);//顯示藍色通道的的圖


tmp_type=RGBQUAD_FILLTYPE_RGB;

SplitChannel(2,tmp_type);//顯示紅色通道的圖


tmp_type=RGBQUAD_FILLTYPE_BLUE;

SplitChannel(0,tmp_type);//顯示藍色通道的的圖

RGBQUADFillType(RGBQUAD_FILLTYPE_GRAY); //將藍色通道的圖的調色板設置為灰度圖.這時顯示的就是灰度圖.

效果如下.



這樣顯示的圖片就是

(居然傳不上圖片)..只好等以後上傳了..



相关文章推荐

OpenCv学习笔记(四):使用split函数提取彩色图像的三个通道

split函数的主要功能是把一个彩色图像分割成3个通道,方便进一步的图像处理,具体说明如下: split Divides a multi-channel array into several sin...

opencv split和merge操作

#include #include #include #include using namespace cv; using namespace std; int main() { Mat srcIm...

【OpenCV3】图像通道分离与合并——cv::split()与cv::merge()详解

在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理;有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像。opencv2和opencv3中实现图像通道的合并与分...

OpenCV代码提取:merge/split函数的实现

OpenCV代码提取:merge/split函数的实现

OpenCV+Tesseract进行OCR学习(二)文字识别

OpenCV的Tesseract使用OpenCV的Tesseract使用Mac端的Tesseract使用 iOS端的Tesseract使用 Mac端的Tesseract使用Tesseract的安装 ...

tesseract-ocr识别英文和中文图片文字以及扫描图片实例讲解

http://jaist.dl.sourceforge.net/project/tesseract-ocr-alt/tesseract-ocr-setup-3.02.02.exe

opencv学习(5)图像像素的访问、颜色通道的分离和融合

代码都是源于毛星云的《opencv3.0编程入门》1、计时函数 getTickCount()和getTickFrequency()函数; getTickCount()函数返回CPU自某个事件...

opencv学习(十四)之图像颜色通道分离和融合

在图像处理时,我们接触到的彩色以RGB居多,为了分析图像在某一通道上的特性,需要将图像的颜色通道进行分离,或者是在对某一颜色通道处理后重新进行融合。opencv提供了split()函数来进行颜色通道的...

OpenCV学习(十四)之彩色图像RGB通道的分离、合并与显示

由于算法的需要,需要把彩色图像的R、G、B值分离出来,OpenCV中正好有split() 和 merge() 函数可以实现。 实验环境:VS2010 + OpenCV2.4.9 一、对单独彩色图片...
  • ZYTTAE
  • ZYTTAE
  • 2014年12月29日 10:14
  • 6818

OpenCV學習心得(6) -- 圖像的縮放

轉載請著名出處與作者 OpenCV提供了一個實現圖像縮放的函數:cv::resize void resize(InputArray src, OutputArray dst, Size dsize...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV學習心得(5) -- 圖像通道分離
举报原因:
原因补充:

(最多只允许输入30个字)