opencv实现两个图片的混合

简介

  本文是将在opencv上使用ROI和addWeighted来对两个图片进行混合操作。

ROI

  首先看下使用ROI的实现。
  在《在图像需要位置画方框_opencv(1)(2014-11-25)》中,我们已经讲了ROI的使用,这里就直接看代码了。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <string.h>
#include <opencv/cv.h>
#include <stdio.h>
 
int main(int argc,char *argv[]){
    cv::Mat src1 = cv::imread(argv[1]);
    cv::Mat src2 = cv::imread(argv[2]);
 
    cv::Mat imageROI= src1(cv::Rect(200,250,src2.cols,src2.rows));
    src2.copyTo(imageROI);
 
    cv::namedWindow("dst");
    cv::imshow("dst",src1);
    cv::waitKey(0);
    return 0;
}
  代码首先是打开了两张图片,接着将第二张图片加到了第一张图片指定的位置上,效果如下。
  第一张图片:

  第二张图片:

    混合后的效果图片:

addWeighted

  讲这个方法之前,首先需要看一个公式:
                      g(x) = (1 - a)f0(x) + af1(x)
    它的意思是:对两幅图像(f0(x)和f1(x))或两段视频(同样为(f0(x)和f1(x))产生时间上的画面叠化(cross-dissolve)效果。
核心函数如下:
    void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
    src1:需要混合的第一张图片。
    alpha:第一张图片的权重。
    src2:需要混合的第二张图片。
    beta:第二张图片的权重。
    gamma:一个加到权重总和上的标量值。
          可以看如下公式:dst = src1[I]*alpha+ src2[I]*beta + gamma;
    dst:混合后的目标图片。
    dtype:输出阵列的可选深度。
    使用该方法进行混合的代码如下:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <string.h>
#include <opencv/cv.h>
#include <stdio.h>
 
int main(int argc,char *argv[]){
    cv::Mat src1 = cv::imread(argv[1]);
    cv::Mat src2 = cv::imread(argv[2]);
    cv::Mat dst;
 
    double alpha = 0.5; double beta; double input;
 
    beta = (1.0 - alpha);
    addWeighted(src1, alpha, src2, beta, 0.0, dst);
 
    cv::namedWindow("dst");
    cv::imshow("dst",dst);
    cv::waitKey(0);
    return 0;
}
    注意:addWeighted混合的图像必须有相同的size。使用该代码是按0.5的权重进行混合,混合效果如下:

两张用来混合的源图像:

 

混合出来的效果图如下:

ROI和addWeighted共同作用

    最后是同时使用这这种办法,来实现将一张图片,以权重方式加到另一张图片指定位置处。
代码如下:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
#include <string.h>
#include <opencv/cv.h>
#include <stdio.h>
 
int main(int argc,char *argv[]){
    cv::Mat src1 = cv::imread(argv[1]);
    cv::Mat src2 = cv::imread(argv[2]);
    cv::Mat dst;
 
    double alpha = 0.5; double beta; double input;
 
    cv::Mat imageROI = src1(cv::Rect(200,250,src2.cols,src2.rows));
 
    beta = (1.0 - alpha);
    addWeighted(imageROI, alpha, src2, beta, 0.0, imageROI);
 
    cv::namedWindow("dst");
    cv::imshow("dst",src1);
    cv::waitKey(0);
    return 0;
}
    代码中,使用ROI在第一张图片(200,250)的位置,取出了一个第二张图片大小的矩形。接着使用addWeighted以0.5的权重混合ROI与第二张图片的数据。
最后显示出来,两张原图像都是之前使用过的,这里就直接展示它的效果图:

时间: 2024-10-06 05:25:35

opencv实现两个图片的混合的相关文章

基于Qt的OpenGL可编程管线学习(12)- 图片正常混合

两个图片正常混合效果图 fragment Shader // 正常的颜色混合 uniform sampler2D U_MainTexture; uniform sampler2D U_SubTexture; varying vec2 M_coord; void main() {         vec4 blendColor = texture2D(U_SubTexture, M_coord);         vec4 baseColor = texture2D(U_MainTexture, 

OpenCV笔记(四)——两幅图像线性混合、改变图像的亮度和对比度

一.两幅图像线性混合 线性混合,就是g(x) = a*f1(x) + b*f2(x).其中g为输出,f1.f2为输入.a+b=1. 作用1:线性混合可以用于去噪,假设噪声的产生符合均值为零.标准差的独立分布.多个高斯分布求平均值,即可去除噪声. 作用2:用于两张图片的切换.a从大到小变化,b从小到大变化.g就渐渐从f1变到f2. OpenCV提供了addWeighted函数,完成上述功能: C++: void addWeighted(InputArray src1, double alpha,

Convert between cv::Mat and QImage 两种图片类转换

在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ##### // Shallow copy QImage mat2qimage_ref(cv::Mat &m, QImage::Format format) { return QImage(m.data, m.cols, m.rows, m.step, format); } // Deep copy QI

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

opencv缩小两次寻找边界

核心函数:cvPyrDown,cvCanny 程序: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> #include "function.h" int FindBorder_Canny(int argc,char** argv) { IplImage* src=cvLoadImage("e:\\pi

Word中如何让两个图片垂直居中对齐

如图,两个图片都剧终了,大小也一致,但是发现没有对齐,那是因为需要设置(矩阵框住的)缩进,让两个在一起,上下对齐.

做了一个js的拉动遮罩层,两个图片分别显示的效果

想做成车修好了和没修好的对比,所以需要两个图片.需要用到的知识点, 1.定位 2.mouse 的事件(代码中体现) 3.鼠标指针的移动距离算法 4.css中,cursor的应用 好了,废话不多说 ,直接上代码 网站需要的素材,接着往下看下载 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>无标题文档</title> 6 &l

WPF 下两种图片合成或加水印的方式(转载)

来源:http://www.cnblogs.com/lxblog/ 最近项目中应用多次应用了图片合成,为了今后方便特此记下. 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名空间是System.Drawing 和 System.Drawing.Imaging,另一种是WPF中新添加的API,命名空间是 System.Windows.Media 和 System.Windows.Media.Imaging . 我们来做一个简单的例子,分别用上面的两种方式实现,功能是在一个

OpenCV入门:(四:混合两张图片)

1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1) src1 – first input array. alph