(一)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中的紅色分量。
運行結果: