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...
  • gujiligujili
  • gujiligujili
  • 2012年06月10日 20:32
  • 19616

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

在图像处理中,尤其是处理多通道图像时,有时需要对各个通道进行分离,分别处理;有时还需要对分离处理后的各个通道进行合并,重新合并成一个多通道的图像。opencv2和opencv3中实现图像通道的合并与分...
  • guduruyu
  • guduruyu
  • 2017年04月27日 09:11
  • 3589

train_test_split,GridSearchCV,cross_val_score

一:交叉验证 交叉验证示意图:将数据分为训练数据、验证数据和测试数据。 训练数据和验证数据用于做交叉验证和调节参数。测试数据用于求指标。从第一步到第二步,再从第二步到第三步。都可以使用这个函数。 ...
  • github_36326955
  • github_36326955
  • 2017年03月02日 08:56
  • 785

opencv split和merge操作

#include #include #include #include using namespace cv; using namespace std; int main() { Mat srcIm...
  • oMuYeJingFeng1
  • oMuYeJingFeng1
  • 2014年05月13日 09:38
  • 26328

OpenCV Mat图像颜色通道分离(split)合成(merge),各通道合图显示

OpenCV Mat图像颜色通道分离(split)合成(merge),各通道合图显示. #include #include #include #include   ...
  • lcj_cjfykx
  • lcj_cjfykx
  • 2013年06月28日 01:22
  • 11249

OpenCV学习笔记(07):图像通道的分离和混合

1.通道分离函数splitOpenCV提供split函数将多通道的矩阵分离成单通道矩阵,原型如下: void cv::split (const Mat & src, Mat * mvbegin )...
  • CV_Jason
  • CV_Jason
  • 2017年02月14日 15:09
  • 894

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

OpenCV代码提取:merge/split函数的实现
  • fengbingchun
  • fengbingchun
  • 2016年06月26日 11:32
  • 5476

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

轉載請注明出處與作者 OpenCV提供了一個函數可以進行通道的分離,就是 cv::split. void split(const Mat& mtx, vector& mv); void sp...
  • jianguo_cui
  • jianguo_cui
  • 2012年03月21日 19:18
  • 4071

Opencv的split函数-通道分离

#include #include #include using namespace std; using namespace cv; int main() { Mat srcImage = i...
  • qq_23880193
  • qq_23880193
  • 2015年08月27日 10:59
  • 1064

自強不息,學習學習再學習

想起大學時印象很深的的一條循環語句 for (i=0,i ...... 現在,繼續這樣調動自己的學習興趣,不知道這樣寫出來能否運行呢? ...... DATA DIVISION. WORK...
  • rigolo
  • rigolo
  • 2012年06月09日 14:23
  • 137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV學習心得(5) -- 圖像通道分離
举报原因:
原因补充:

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