OpenCV学习笔记之图像融合

ゝ一世哀愁。 2023-07-14 10:53 92阅读 0赞

一、线性融合操作

线性混合操作 也是一种典型的二元(两个输入)的 像素操作

g(x) = (1 - \\alpha)f\_\{0\}(x) + \\alpha f\_\{1\}(x)

通过在范围 0 \\rightarrow 1 内改变 \\alpha ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果,就像在幻灯片放映和电影制作中那样

二、操作实践

  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <opencv2/core.hpp>
  4. #include <opencv2/highgui.hpp>
  5. #include <opencv2/imgproc.hpp>
  6. #include <opencv2/imgcodecs.hpp>
  7. #include <QDebug>
  8. #include <QDir>
  9. #include <QFile>
  10. #include "iostream"
  11. using namespace std;
  12. using namespace cv;
  13. int main()
  14. {
  15. double alpha = 0.5; double beta;
  16. Mat src1, src2, dst;
  17. //! 读取图片
  18. src1 = imread("C:/2.png");
  19. src2 = imread("C:/3.png");
  20. if( !src1.data ) { qDebug("Error loading src1 \n"); return -1; }
  21. if( !src2.data ) { qDebug("Error loading src2 \n"); return -1; }
  22. //! 调整两幅图片保持一致,否则会出错
  23. resize(src2, src2, Size(src1.cols, src1.rows));
  24. beta = ( 1.0 - alpha );
  25. addWeighted( src1, alpha, src2, beta, 0.0, dst);
  26. imshow( "Linear Blend", dst );
  27. waitKey(0);
  28. return 0;
  29. }

20200314162743741.png 20200314162755777.png20200314162925587.png

src1 src2 dst

参考资料:

  • 使用OpenCV对两幅图像求和(求混合(blending))

附录1:addWeighted()函数实现图像线性混合

  1. void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
  2. 第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat
  3. 第二个参数,alpha,表示第一个数组的权重
  4. 第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
  5. 第四个参数,beta,表示第二个数组的权重值。
  6. 第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
  7. 第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
  8. 第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

发表评论

表情:
评论列表 (有 0 条评论,92人围观)

还没有评论,来说两句吧...

相关阅读

    相关 OpenCV学习笔记扫描图像

    一、 图像在内存中存储方式 图像矩阵的大小取决于我们所用的颜色模型,确切地说,取决于所用通道数。如果是灰度图像,矩阵就会像这样: ![\\newcommand\{\\t