opencv學習(十四)之影象顏色通道分離和融合
阿新 • • 發佈:2019-02-02
在影象處理時,我們接觸到的彩色以RGB居多,為了分析影象在某一通道上的特性,需要將影象的顏色通道進行分離,或者是在對某一顏色通道處理後重新進行融合。opencv提供了split()函式來進行顏色通道的分離,提供了merge()函式來進行顏色通道的融合。
1.split()函式
顏色通道分離函式,其定義如下所示:
CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
CV_EXPORTS void split(const Mat& m, vector<Mat>& mv );
其有兩種定義形式。
.第一個引數是輸入分離通道的影象
.第二個引數是一個Mat型別的vector容器,用來存放分離後的通道
2.merge()函式
CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
CV_EXPORTS void merge(const vector<Mat>& mv, OutputArray dst );
其定義也有兩個定義形式,引數含義與split()函式基本相同。其OutputArray dst可以是一個Mat型別的資料。
示例程式:
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
void addImage(Mat& image, Mat& logoImage, vector<Mat>channels, Mat imageChannel, String title);
int main()
{
Mat srcImage = imread("七龍珠.jpg");
Mat logoImage = imread("七龍珠logo.jpg", IMREAD_GRAYSCALE);
//判斷檔案是否載入成功
if (srcImage.empty() || logoImage.empty())
{
cout << "影象載入失敗!" << endl;
return false;
}
else
cout << "影象載入成功!" << endl;
//對載入的原影象進行通道分離
vector<Mat>channels;
split(srcImage, channels);
Mat imageBlueChannel;
imageBlueChannel = channels.at(0); //提取藍色通道
//視窗名稱,也可以用char陣列,傳入char*來指定視窗名稱
String imageBlueTitle = "藍色通道疊加logo融合";
addImage(srcImage, logoImage, channels, imageBlueChannel, imageBlueTitle);
return 0;
}
void addImage(Mat& image, Mat& logoImage, vector<Mat>channels, Mat imageChannel, String title)
{
//在提取的藍色通道上,指定ROI區域疊加logoImage
addWeighted(imageChannel(Rect(50, 50, logoImage.cols, logoImage.rows)), 1.0, logoImage, 0.7,
0.0, imageChannel(Rect(50, 50, logoImage.cols, logoImage.rows)));
merge(channels, image); //將疊加logo後的藍色通道與另外兩個顏色通道重新融合
imshow(title, image);
waitKey(0);
}
程式分析:
. 通過前面幾篇文章的介紹,我們已經瞭解到在影象中其RGB三通道的排列順序不是我們所熟知的RGB,而是BGR,所以在得到channels後,可以通過at()函式來指定顏色通道,如在程式中
imageBlueChannel = channels.at(0);
即將藍色通道提取出來,同樣通過這種方法也可以將綠色和紅色通道進行提取
. 在將logo疊加到圖片上時用到了函式addWeighted()函式,這個函式在前面的文章有提到,可以點選檢視該函式的用法。
程式執行結果