1. 程式人生 > >opencv學習日記之單通道分離多通道融合

opencv學習日記之單通道分離多通道融合

程式碼:

#include"stdafx.h"
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace std;

bool LinearBlending();
void splitImage();
void colorReduce(Mat & inputImage, Mat & outputImage, int value1, int valut2, int value3);

int main(void)
{
	// 呼叫
	bool linearblending = LinearBlending();

	cout << linearblending << endl;

	splitImage();

	waitKey(0);
	return(0);  
}

bool LinearBlending() {
	// 定義區域性變數
	double alphaValue = 0.6;
	double betaValue;
	// 讀取圖片,兩個圖片大小尺寸必須一樣
	Mat src1, src2, dst;
	src1 = imread("E:\\pictures\\For_Project\\New_opencv\\newstar.jpg");
	src2 = imread("E:\\pictures\\For_Project\\New_opencv\\newgo.jpg");
	// 影象混合加權操作
	betaValue = 1.0 - alphaValue;
	addWeighted(src1, alphaValue, src2, betaValue, 0.6, dst);

	namedWindow("原圖1");
	imshow("原圖1", src1);

	namedWindow("原圖2");
	imshow("原圖2", src2);

	namedWindow("效果");
	imshow("效果", dst);

	return true;

}

void splitImage() {
	Mat srcImage = imread("E:\\pictures\\For_Project\\Opencv_Test\\cao.png");

	Mat blueImage, greenImage, redImage;

	vector<Mat> channels;

	split(srcImage, channels);

	namedWindow("原圖");
	imshow("原圖", srcImage);

	blueImage = channels.at(0);
	namedWindow("Blue");
	imshow("Blue", blueImage);

	greenImage = channels.at(1);
	namedWindow("Green");
	imshow("Green", greenImage);

	redImage = channels.at(2);
	namedWindow("Red");
	imshow("Red", redImage);

	Mat dst;
	merge(channels, dst);
	imshow("合成", dst);

	Mat imgMix;
	imgMix.create(600, 800, CV_8UC3);
	colorReduce(imgMix, imgMix, 255, 0, 0);
	imshow("Mix", imgMix);
}

void colorReduce(Mat & inputImage, Mat & outputImage, int value1, int value2, int value3) {
	// 複製實參到臨時變數
	outputImage = inputImage.clone();
	// 分別獲取行數和列數
	int rowNumber = outputImage.rows;
	int colNumber = outputImage.cols;
	// 存取彩色影象畫素
	for (int i = 0;i < rowNumber;i++) {
		for (int j = 0;j < colNumber;j++) {
			// 藍色通道
			outputImage.at<Vec3b>(i, j)[0] = value1;
			// 綠色通道
			outputImage.at<Vec3b>(i, j)[1] = value2;
			// 紅色通道
			outputImage.at<Vec3b>(i, j)[2] = value3;
		}
	}
}
效果: