OpenCV实践(4)- 叠加两幅图片

    xiaoxiao2021-03-26  9

    1 目标 (1) 什么是线性混合,有什么用? (2) 怎样使用addWeighted混合两幅图像? 2 原理 详细的理论请参考计算机视觉:算法和应用一书。 这里我们直接应用其公式: 对于上面的公式,很有理解,等式右边就是两个像素值相加,但是权重比不同。所以,我们通过变化 ,区间是[0,1],这个操作就能带来一副由两幅图片临时相加得到的图像。如果将其应用在幻灯片放映或者视频播放中,岂不是很酷? 3 代码实现 道理很简单,直接上代码:

    #include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; int main( int argc, char** argv ) { double alpha = 0.5; double beta; double input; Mat src1, src2, dst; /// Ask the user enter alpha std::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 if it is between 0 and 1 if( input >= 0.0 && input <= 1.0 ) { alpha = input; } /// Read image ( same size, same type ) src1 = imread("../images/LinuxLogo.jpg"); src2 = imread("../images/WindowsLogo.jpg"); if( !src1.data ) { printf("Error loading src1 \n"); return -1; } if( !src2.data ) { printf("Error loading src2 \n"); return -1; } /// Create Windows namedWindow("Linear Blend", 1); beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0, dst); imshow( "Linear Blend", dst ); waitKey(0); return 0; }

    4 代码解释 (1)为了实现上面的公式, 我们需要两幅源图像 和 ,我们使用下面的代码载入:

    src1 = imread("../images/LinuxLogo.jpg"); src2 = imread("../images/WindowsLogo.jpg"); 警告:因为我们要叠加src1和src2,所以两幅图片必须具有相同的大小(高和宽)和类型。

    (2) 应用addWeighted

    beta = ( 1.0 - alpha ); addWeighted( src1, alpha, src2, beta, 0.0, dst);

    addWeighted的处理过程: 在这里, 就是上面代码中的0.0,它是一个标量,可以对合成后的图片进行像素的调整。 5 结论 运行结果: 上图中左半部分就是 = 0.0,右半部分是 = 100时的图片。

    转载请注明原文地址: https://ju.6miu.com/read-650266.html

    最新回复(0)