轉載請注明出處與作者

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

效果如下.



這樣顯示的圖片就是

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



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐