1. 程式人生 > >opencv學習(十四)之影象顏色通道分離和融合

opencv學習(十四)之影象顏色通道分離和融合

在影象處理時,我們接觸到的彩色以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()函式,這個函式在前面的文章有提到,可以點選檢視該函式的用法。

程式執行結果
這裡寫圖片描述