在Open CV的图像操作中,我们可以通过cvAddWeighted函数实现两张图片的融合,函数完整签名为:
void cvAddWeighted(
const CvArr* src1,
double alpha,
const CvArr* src2,
double beta,
double gamma,
CvArr* dst
);
参数 | 意义 |
---|---|
src1 | 第一张图片 |
alpha | 融合时的第一张图片参数 |
src2 | 第二种图片 |
beta | 融合时的第二种图片参数 |
gamma | 常数项,往往取决于像素要调整到的平均值和最大值 |
dst | 融合后的图片 |
此函数的功能就是加权融合图像,每个像素点的像素是两种源图片的对应像素点的像素加权算出来的,融合公式如下:
dst = alpha*src1 + beta*src2 + gamma
当alpha为a,beta为1-a,gamma为0,其中,a>=0且a<=1时,融合方程被称为标准融合方程。
下面是示例:
#include "cv.h"
#include "highgui.h"
int main(){
//待融合的两张图片名
char* imgStr1 = "faceScene.jpg";
char* imgStr2 = "fruits.jpg";
//打开两张图片
IplImage* img1 = cvLoadImage(imgStr1);
IplImage* img2 = cvLoadImage(imgStr2);
//设置alpha、beta、gamma参数
//设置三者的值分别为a,1-a和0,这是标准Alpha融合方程
float alpha = 0.3;
float beta = 0.7;
float gamma = 0;
//创建一张图片来接收融合的图片
IplImage* dst = cvCreateImage(
cvSize(img1->width, img1->height),
img1->depth,
3);
//使用cvAddWeighted执行Alpha融合
cvAddWeighted(img1, alpha, img2, beta, gamma, dst);
//输出三张图片查看效果
char* s1 = "img1", *s2 = "img2", *s3 = "dst";
cvNamedWindow(s1); cvNamedWindow(s2); cvNamedWindow(s3);
cvShowImage(s1, img1); cvShowImage(s2, img2); cvShowImage(s3, dst);
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&img2);
cvReleaseImage(&dst);
cvDestroyWindow(s1); cvDestroyWindow(s2); cvDestroyWindow(s3);
}
待融合图片1:
待融合图片2:
融合成功后的图片:
原文地址:http://blog.csdn.net/zgljl2012/article/details/45298021