opencv學習之------分離顏色通道用到的split函數和合並用到的merge()函數

(一)split函數

將一個多通道數組分離成幾個單通道數組用到的是進行通道分離的split函數。

split函數的C++版本有兩個原型,他們分別是:

1.	C++: void split(const Mat& src, Mat*mvbegin);
2.	C++: void split(InputArray m,OutputArrayOfArrays mv);

兩種定義的用法相同:

  • 第一個參數,InputArray類型的m或者const Mat&類型的src,填我們需要進行分離的多通道數組。
  • 第二個參數,OutputArrayOfArrays類型的mv,填函數的輸出數組或者輸出的vector容器。

示例如下:

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat image = imread("8.jpg");
	if (image.data == 0)
	{
		cout << "讀取錯誤" << endl;
	}
	imshow("原圖", image);

	//使用Mat容器,用【】訪問
	//vector<Mat> channels;
	//split(image, channels);
	//imshow("B", channels[0]);
	//imshow("G", channels[1]);
	//imshow("R", channels[2]);

	//使用Mat容器,用at訪問
	vector<Mat> channels;
	split(image, channels);
	imshow("B", channels.at(0));
	imshow("G", channels.at(1));
	imshow("R", channels.at(2));

	//使用Mat數組,只能用【】訪問  
	//Mat aChannel[3];
	//split(image, aChannel);
	//imshow("B", aChannel[0]);
	//imshow("G", aChannel[1]);
	//imshow("R", aChannel[2]);

	waitKey();
	return 0;
}

運行結果:

(二)merge()函數

merge()函數的功能是split()函數的逆向操作,將多個數組組合合併成一個多通道的數組。

它通過組合一些給定的單通道數組,將這些孤立的單通道數組合併成一個多通道的數組,從而創建出一個由多個單通道陣列組成的多通道陣列。它有兩個基於C++的函數原型:

1.C++: void merge(const Mat* mv, size_tcount, OutputArray dst)
2.C++: void merge(InputArrayOfArrays mv,OutputArray dst)

 

  • 第一個參數,mv,填需要被合併的輸入矩陣或vector容器的陣列,這個mv參數中所有的矩陣必須有着一樣的尺寸和深度。
  • 第二個參數,count,填要合併矩陣的個數,通常情況下圖像大都是單通道的灰度圖或三通道的真彩圖,因此要想合併後的輸出dst能直接用imshow()顯示的話,最好填1或3,填2也能進行數據的合併,但輸出時會報錯
  • 第三個參數,dst,即通道合併後的輸出矩陣,和mv[0]擁有一樣的尺寸和深度,並且通道的數量是矩陣陣列中的通道的總數。

merge函數的功能是將一些數組合併成一個多通道的數組。關於組合的細節,輸出矩陣中的每個元素都將是輸出數組的串接,其中,第i個輸入數組的元素被視爲mv[i]。 c一般用其中的Mat::at()方法對某個通道進行存取,也就是這樣用channels.at(0)。

程序示例如下:

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat image = imread("8.jpg");
	if (image.data == 0)
	{
		cout << "讀取錯誤" << endl;
	}
	imshow("原圖", image);

	//通道分離
	Mat aChannel[3];
	split(image, aChannel);
	Mat BlueChannel = aChannel[0];
	Mat GreenChannel = aChannel[1];
	Mat RedChannel = aChannel[2];

	//將R通道全部置0
	Mat newAddChannel = aChannel[2].clone();
	newAddChannel.setTo(0);
	Mat newChannels[3] = { BlueChannel, GreenChannel, newAddChannel };

	//通道合併
	Mat mergedImage;
	merge(newChannels, 3, mergedImage);

	imshow("Merged", mergedImage);
	waitKey();
	return 0;
}

        根據OpenCV的BGR色彩空間(bule,Green,Red,藍綠紅),其中channels.at(0)就表示引用取出channels中的藍色分量,channels.at(1)就表示引用取出channels中的綠色色分量,channels.at(2)就表示引用取出channels中的紅色分量。

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章