VS2017 OpenVC3 分離顏色通道&多通道影象混合
阿新 • • 發佈:2018-11-16
//-----------------------------------【標頭檔案包含部分】---------------------------------------
// 描述:包含程式所依賴的標頭檔案
//----------------------------------------------------------------------------------------------
#include "pch.h"
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//-----------------------------------【名稱空間宣告部分】---------------------------------------
// 描述:包含程式所使用的名稱空間
//-----------------------------------------------------------------------------------------------
using namespace cv;
using namespace std;
//-----------------------------------【全域性函式宣告部分】--------------------------------------
// 描述:全域性函式宣告
//-----------------------------------------------------------------------------------------------
bool MultiChannelBlending();
//-----------------------------------【main( )函式】--------------------------------------------
// 描述:控制檯應用程式的入口函式,我們的程式從這裡開始
//-----------------------------------------------------------------------------------------------
int main()
{
system("color5E");
if (MultiChannelBlending())
{
cout << endl << "得出了你需要的混合值影象~";
}
waitKey(0);
return 0;
}
//-----------------------------【MultiChannelBlending( )函式】--------------------------------
// 描述:多通道混合的實現函式
//-----------------------------------------------------------------------------------------------
bool MultiChannelBlending()
{
//【0】定義相關變數
Mat srcImage;
Mat logoImage;
vector<Mat>channels;
Mat imageBlueChannel;
//=================【藍色通道部分】=================
// 描述:多通道混合-藍色分量部分
//============================================
//【1】讀入圖片
logoImage = imread("jinan_logo.jpg", 0);
srcImage = imread("jinan.jpg");
if (!logoImage.data) { printf("讀取logoImage錯誤~!\n"); return false; }
if (!srcImage.data) { printf("讀取srcImage錯誤~!\n"); return false; }
//【2】把一個3通道影象轉換成3個單通道影象
split(srcImage, channels);//分離色彩通道
//【3】將原圖的藍色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變
imageBlueChannel = channels.at(0);
//【4】將原圖的藍色通道的(50,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageBlueChannel中
addWeighted(imageBlueChannel(Rect(50, 250, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0, imageBlueChannel(Rect(50, 250, logoImage.cols, logoImage.rows)));
//【5】將三個單通道重新合併成一個三通道
merge(channels, srcImage);
//【6】顯示效果圖
namedWindow("<1>趵突泉+logo藍色通道");
imshow("<1>趵突泉+logo藍色通道", srcImage);
//=================【綠色通道部分】=================
// 描述:多通道混合-綠色分量部分
//============================================
//【0】定義相關變數
Mat imageGreenChannel;
//【1】重新讀入圖片
logoImage = imread("jinan_logo.jpg", 0);
srcImage = imread("jinan.jpg");
if (!logoImage.data) { printf("讀取logoImage錯誤~!\n"); return false; }
if (!srcImage.data) { printf("讀取srcImage錯誤~!\n"); return false; }
//【2】將一個三通道影象轉換成三個單通道影象
split(srcImage, channels);//分離色彩通道
//【3】將原圖的綠色通道的引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變
imageGreenChannel = channels.at(1);
//【4】將原圖的綠色通道的(50,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageGreenChannel中
addWeighted(imageGreenChannel(Rect(50, 250, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0., imageGreenChannel(Rect(50, 250, logoImage.cols, logoImage.rows)));
//【5】將三個獨立的單通道重新合併成一個三通道
merge(channels, srcImage);
//【6】顯示效果圖
namedWindow("<2>趵突泉+logo綠色通道");
imshow("<2>趵突泉+logo綠色通道", srcImage);
//=================【紅色通道部分】=================
// 描述:多通道混合-紅色分量部分
//============================================
//【0】定義相關變數
Mat imageRedChannel;
//【1】重新讀入圖片
logoImage = imread("jinan_logo.jpg", 0);
srcImage = imread("jinan.jpg");
if (!logoImage.data) { printf("讀取logoImage錯誤~!\n"); return false; }
if (!srcImage.data) { printf("讀取srcImage錯誤~!\n"); return false; }
//【2】將一個三通道影象轉換成三個單通道影象
split(srcImage, channels);//分離色彩通道
//【3】將原圖的紅色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變
imageRedChannel = channels.at(2);
//【4】將原圖的紅色通道的(50,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageRedChannel中
addWeighted(imageRedChannel(Rect(50, 250, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0., imageRedChannel(Rect(50, 250, logoImage.cols, logoImage.rows)));
//【5】將三個獨立的單通道重新合併成一個三通道
merge(channels, srcImage);
//【6】顯示效果圖
namedWindow("<3>趵突泉+logo紅色通道");
imshow("<3>趵突泉+logo紅色通道", srcImage);
return true;
}
參考:
split
merge
https://blog.csdn.net/poem_qianmo/article/details/21176257