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

轉載請注明出處與作者

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); //將藍色通道的圖的調色板設置為灰度圖.這時顯示的就是灰度圖.

效果如下.



這樣顯示的圖片就是

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值