天天看點

VS2017 OpenVC3 分離顔色通道&多通道圖像混合

//-----------------------------------【頭檔案包含部分】---------------------------------------
//     描述:包含程式所依賴的頭檔案
//----------------------------------------------------------------------------------------------                                                                                    
#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;
}