我的OPENCV学习笔记-图像混合

来源:互联网 发布:温州网络学堂挂机 编辑:程序博客网 时间:2024/05/16 02:34

混合原理:线性混合

g(x)=(1-a)Ima1+aIma2


根据http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/adding_images/adding_images.html#adding-images 中对该原理的解释:

以下解释基于Richard Szeliski所著 Computer Vision: Algorithms and Applications

通过在范围 0 \rightarrow 1 内改变\alpha ,这个操可以用来对两幅图像或两段视频产生时间上的画面叠化 (cross-dissolve)效果,就像在幻灯片放映和电影制作中那样(很酷吧?)(译者注:在幻灯片翻页时可以设置为前后页缓慢过渡以产生叠加效果,电影中经常在情节过渡时出现画面叠加效果)。


代码如下:

修改自http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/adding_images/adding_images.html#adding-images中代码

#include "stdafx.h"#include <opencv2/imgcodecs.hpp>#include <opencv2/imgproc.hpp>#include <opencv2/videoio.hpp>#include <opencv2/highgui.hpp>#include <string.h>#include <iostream>using namespace cv;using namespace std;/*int main() {Mat img  = imread("d:\\1.jpg");namedWindow("aa");imshow("aa", img);waitKey(6000);}*/int main(int argc, char** argv){double alpha = 0.5; double beta; double input;Mat src1, src2, dst;/// Ask the user enter alphastd::cout << " Simple Linear Blender " << std::endl;std::cout << "-----------------------" << std::endl;std::cout << "* Enter alpha [0-1]: ";std::cin >> input;/// We use the alpha provided by the user iff it is between 0 and 1if (alpha >= 0 && alpha <= 1){alpha = input;}/// Read image ( same size, same type )src1 = imread("D:\\IMG_1.JPG");src2 = imread("D:\\IMG_2.JPG");if (!src1.data) { printf("Error loading src1 \n"); return -1; }if (!src2.data) { printf("Error loading src2 \n"); return -1; }/// Create WindowsnamedWindow("Linear Blend", 1);beta = ( alpha);addWeighted(src1, alpha, src2, beta, 0.0, dst);imshow("Linear Blend", dst);waitKey(0);return 0;}

个人理解:

我试图将(1-a)在代码中变换为a,尝试一下如果当a为1,即g(x)=Ima1+Ima2的情景

下面是两张原图:

(取自在我高中的照片)

我们可以看到,第一张图片很像是将对比度放大后与第二张的混合。

如果我根据Opencv网站源码的要求进行编译,则会出现下面的效果:

beta = (1.0- alpha);

这样就很符合所谓的动态的渐变效果。

但如果将1.0改为0.8或者更小怎么样(我却是没有很明白它这些参数对图片的修改到底是怎么样的,只能如此尝试)

beta = (0.7- alpha);

我们发现IMG_2暗淡了一些。

所以问题就来了,addWeighted函数将两个图像混合

cvAddWeighted( const CvArr* src1, double alpha,  const CvArr* src2, double beta,  double gamma, CvArr* dst );


那么alpha,beta决定的是比例(0<=x<=1),那么它对应的修改Mat如何做到的?

这种彩色图像应该是三通道RGB的,也就是说,如果将RGB三个参数缩放同比例值会有相应的效果?

该问题存疑。


我们看到,有一个参数double gamma,根据资料查找,我知道这是微调,但并没有人说明这个参数对整体的影响,接下来我来实验一下。


addWeighted(src1, alpha, src2, beta, 0.5, dst);


令我费解的是,这一张与上上一张并没有感觉有太大的差距。难道是我的值太小了?

addWeighted(src1, alpha, src2, beta, 5, dst);

遗憾的是,我仍然没有看出来有什么不同,不过一些细节的对比,发现这并不是位移上的微调,可能是颜色上的吧。。。存疑。





存疑内容:

1.alpha等参数在addWeighted函数中作用是调节比例,那在Mat中是如何运作的?

2.在addWeighted中的参数 double gamma据说是用来微调的,但它到底是调节什么的?

求各路大神告知,小弟拜谢


原创粉丝点击