1. 程式人生 > >影象處理算法系列 第五章 影象合成

影象處理算法系列 第五章 影象合成

這篇文章將講述圖片合成的例子。

如何將兩個圖片合成一張圖片呢?

這個問題看起來很深奧,包括ps上面其實用的最多的東西也屬於圖片合成技術。

但是線性的圖片合成其實很簡單。

一原理:

兩個圖片的融合,首先兩個圖片大小必須一致,如果不一致怎麼辦,要使用ROI區域,找到大圖片中要和小圖片進行融合的尺寸。

g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

兩個圖片的畫素值,按照給定的比例進行疊加,就可以將兩個圖片融合起來。

二演算法:

演算法很簡單,通過原理可以很簡單的看到演算法的實現,這裡不羅嗦了,想了解更多的請看:

三 程式碼

void blendTwoImage(Mat src1,float alpa, Mat src2, float beta, float gama, Mat &dst)
{
	dst.create(src1.size(),src1.type());
	uchar *psrc1;
	uchar *psrc2;
    uchar *pdst;

	

	int channels = src1.channels();

	std::cout<<src1.rows<<" "<<src1.cols<<std::endl;

	for (int i = 0; i<src1.rows; i++)
	{
		psrc1 = src1.ptr<uchar>(i);
		psrc2 = src2.ptr<uchar>(i);
		pdst = dst.ptr<uchar>(i);

		for (int j =0; j <src1.cols; j++)
		{
			int B;
			int G;
			int R;
			B = psrc1[j*channels] *alpa +  psrc2[j*channels] *beta + gama;
			G = psrc1[j*channels + 1] *alpa +  psrc2[j*channels + 1] *beta + gama;
			R = psrc1[j*channels + 2] *alpa +  psrc2[j*channels + 2] *beta + gama;
			if (B>255)
				B = 255;
			if (G>255)
				G = 255;
			if (R>255)
				R = 255;
			pdst[j*channels] = B;
			pdst[j*channels + 1] = G;
			pdst[j*channels + 2] = R;
			//std::cout<<i<<" " <<j<<std::endl;
		}
	}

}


四效果圖
原始 本文