这篇文章将讲述图片合成的例子。
如何将两个图片合成一张图片呢?
这个问题看起来很深奥,包括ps上面其实用的最多的东西也属于图片合成技术。
但是线性的图片合成其实很简单。
一原理:
两个图片的融合,首先两个图片大小必须一致,如果不一致怎么办,要使用ROI区域,找到大图片中要和小图片进行融合的尺寸。
两个图片的像素值,按照给定的比例进行叠加,就可以将两个图片融合起来。
二算法:
算法很简单,通过原理可以很简单的看到算法的实现,这里不罗嗦了,想了解更多的请看:
三 代码
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;
}
}
}
四效果图
原始 | 本文 |
![]() | ![]() |