1. 程式人生 > >OpenCV 影象分離顏色通道 split函式和mege函式的運用

OpenCV 影象分離顏色通道 split函式和mege函式的運用

學了好幾天了,突然在影象分離顏色通道這裡遇到了個大門檻,這裡總結一下自己的經驗。

關鍵程式碼我是從他這裡考出來的,沒有知道,只能讀它的原始碼,但當我執行的時候就蒙了,亂七八糟的報錯,最後跟蹤是在split函式這裡出錯了,程式碼完全一樣,但是就是過不去

  1.        Mat srcImage;  
  2.        Mat logoImage;  
  3.        vector<Mat>channels;  
  4.        Mat  imageBlueChannel;  
  5.        logoImage=imread("dota_logo.jpg",0);  
  6.        srcImage=imread("dota_jugg.jpg"
    );  
  7.        if(!logoImage.data ) { printf("Oh,no,讀取logoImage錯誤~!\n"); returnfalse; }  
  8.        if(!srcImage.data ) { printf("Oh,no,讀取srcImage錯誤~!\n"); returnfalse; }  
  9.        split(srcImage,channels);//就是這裡,怎麼都過不去
  10.        imageBlueChannel=channels.at(0);  
  11.        addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,  
  12.               logoImage,0.5,0,imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)));  
  13.        merge(channels,srcImage);  
  14.        namedWindow("<1>遊戲原畫+logo藍色通道 by淺墨");  
  15.        imshow("<1>遊戲原畫+logo藍色通道 by淺墨",srcImage);  

後來發現我的vector 這個向量在這裡不能用,於是我就將vector換成了May channels[4],成功了,(修改過程經過反覆捉摸啊)

	//【0】定義相關變數  
	Mat srcImage;
	Mat logoImage;
	Mat channels[4];
	Mat  imageBlueChannel;

	//=================【藍色通道部分】=================  
	//     描述:多通道混合-藍色分量部分  
	//============================================  

	//【1】讀入圖片  
	logoImage = imread("dota_logo.jpg", 0);
	srcImage = imread("dota.jpg");

	if (!logoImage.data) { printf("Oh,no,讀取logoImage錯誤~!\n"); return; }
	if (!srcImage.data) { printf("Oh,no,讀取srcImage錯誤~!\n"); return; }

	//【2】把一個3通道影象轉換成3個單通道影象  
	split(srcImage, channels);//分離色彩通道  

	//【3】將原圖的藍色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變  
	imageBlueChannel = channels[1];
	//【4】將原圖的藍色通道的(500,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageBlueChannel中  
	addWeighted(imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)), 1.0,
		logoImage, 0.5, 0, imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)));

	//【5】將三個單通道重新合併成一個三通道
	merge(channels, 3, srcImage);

	//【6】顯示效果圖  
	namedWindow("<1>遊戲原畫+logo藍色通道 by淺墨");
	imshow("<1>遊戲原畫+logo藍色通道 by淺墨", srcImage);
	waitKey(10000);

修改完程式碼,最這些程式碼的理解也深入了許多,開始不明白,既然要分logo的通道,那為什麼要split函式裡面要寫srcImage這個影象矩陣那,後來發現影象一旦分解為三個通道,那三個影象就都變成了灰色,並不能看出測彩的變化,淺墨這麼做分解了背景圖片的三個通道,然後用單通道的方式,讀取了logo圖片,最後將logo圖片合成到srcImage圖片上,有餘srcImage的某個通道色彩改變了,影象三個通道合成後就呈現了除了我們想要的效果。