-
OpenCV处理图像混合主要是根据线性混合函数,通过在0到1范围内改变α的值,使两幅图像或者视频产生在时间上的画面叠化得效果。实际上α和β的和不一定为1,只是为了防止图像出现过饱和的现象。
线性公式.png -
在以上公式中,f1(x)和f2(x)分别代表两张图片的矩阵,α和β表示两张图片的权重。这里要注意一点就是因为我们要对两张图片求和,所以它们必须是相同的尺寸和类型。
-
通过函数addWeighted可以方便地实现生成最终图像g(x)的功能,如下
addWeighted(pictureMatA,alpha,pictureMatB,beta,0.0,resultMat);
该函数进行了如下的计算,result = alphapictureMatA + betapictureMatB + gama,在以上公式中,gama为0.0,该参数主要起到了一个微调的作用。
code:
- (void)viewDidLoad {
[super viewDidLoad];
CGRect rect = [UIScreen mainScreen].bounds;
self.imgView.frame = rect;
UIImage *image1 = [UIImage imageNamed:@"dog.jpg"];
UIImageToMat(image1, PictureMatA);
UIImage *image2 = [UIImage imageNamed:@"dog2.png"];
UIImageToMat(image2, PictureMatB);
double t = (double)getTickCount();
blending(PictureMatA, PictureMatB, resultPictureMat);
t = ((double)getTickCount() - t)/getTickFrequency();
cout<< "--------------cost:" << t <<" seconds-----------------" <<endl;
self.imgView.image = MatToUIImage(resultPictureMat);
// Do any additional setup after loading the view, typically from a nib.
}
void blending (const Mat& pictureA ,const Mat& pictureB, Mat& resultPicture)
{
float alpha = 0.2f,beta;
beta = 0.8;
addWeighted(pictureA, alpha, pictureB, beta, 0.0, resultPicture);
}
dog+dog2.png
网友评论