python图片叠加与融合,cv2.add与cv2.addWeighted的区别

目标
图像加法、减法、位运算
学习函数cv2.add(),cv2.addWeighted()

加法:
使用cv2.add()将两个图像相加,可以使用numpy中的矩阵加法来实现。但是在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模。

# 图像上的加法
# 大致有两种:
#       cv2.add():这是一个饱和操作
#       +:这是Numpy中的运算,之一种模操作,res = img1 + img2
# 注意两幅图片的大小类型必须一致,或者第二个图象是一个标量
# 由于两者的差别,我们一般多用cv2.add(src1, src2)

综上,使用opencv的效果更好

img1=cv2.imread('1.jpg')
img2=cv2.imread('2.jpg')res = cv2.add(img1,img2)

原图像


加法后的结果

图像混合(融合,可以设置图片的透明度)
实际上也是加法,只不过是按比例混合起来,有不同的权重 ,给人一种混合的或者透明的感觉
公式如下
g (x) = (1 − α)f0 (x) + αf1 (x)   #a→(0,1)不同的a值可以实现不同的效果

现在第一幅图像的权重是0.7,第二幅图像的权重是0.3,使用cv2.addWeighted()函数进行混合

img1=cv2.imread('1.jpg')
img2=cv2.imread('2.jpg')dst=cv2.addWeighted(img1,0.7,img2,0.3,0)

混合后的结果

按位运算(问题:如何将一个图放到另一个图上去,加法会改变颜色,混加会透明)

位运算操作有and, or, not, xor。在提取部分图像选择非举行区域roi时,位运算操作十分有用。下面例子是改变一副图像的特定区域。
把opencv的标志放到另外一副图像上,如果使用加法,颜色会改变,如果使用混合,会变成透明,但是我们不想要透明效果,如果是举行区域,可以使用roi方法,但是并不是举行,下面使用位运算实现。

import cv2
import numpy as np
# 加载图像
img1 = cv2.imread('2.jpg')
img2 = cv2.imread('1.jpg')rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)      # 将图片灰度化
ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)#ret是阈值(175)mask是二值化图像
mask_inv = cv2.bitwise_not(mask)#获取把logo的区域取反 按位运算img1_bg = cv2.bitwise_and(roi,roi,mask = mask)#在img1上面,将logo区域和mask取与使值为0# 取 roi 中与 mask_inv 中不为零的值对应的像素的值,其他值为 0 。
# 把logo放到图片当中
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)#获取logo的像素信息dst = cv2.add(img1_bg,img2_fg)#相加即可
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img2_fg)
cv2.waitKey(0)
cv2.destroyAllWindows()

样例里面的思路比较巧妙,logo的背景都是黑色的,方便提取出来
先将logo设定阈值并二值化,得到logo区域的范围
将在背景图片中要放置logo区域的像素信息用位运算置0
将logo的像素信息和背景图片的像素相加
最后就这这个效果

练习
制作一个类似幻灯片似的的图片平滑过渡到另外一张图片(类似凤姐变成刘亦菲)

import cv2
import numpy as npdef nothing(x):passimg1 = cv2.imread('1.jpg')
img2 = cv2.imread('2.jpg')
# 创建一个黑色背景的窗口
img = np.zeros((500,500,3), np.uint8)
cv2.namedWindow('image')cv2.createTrackbar('a','image',0,100,nothing)while(1):cv2.imshow('image',img)k = cv2.waitKey(1) & 0xFFif k == 27:breakr = cv2.getTrackbarPos('a','image')r=float(r)/100.0img=cv2.addWeighted(img1,r,img2,1.0-r,0)cv2.destroyAllWindows()

import cv2
import numpy as npimport time
step_list = [0.02 * x for x in range(0, 51)]
img1 = cv2.imread("1.jpg")
img2 = cv2.imread("2.jpg")
cv2.imshow("show", img1)
for i in step_list:res = cv2.addWeighted(img1, i, img2, (1-i), 0)cv2.imshow("show", res)cv2.waitKey(60)
if cv2.waitKey(0) ==27:# 按'Esc'退出cv2.destroyAllWindows()

OpenCV-Python图片叠加与融合,cv2.add与cv2.addWeighted的区别相关推荐

  1. OpenCV python 图片镜像

    OpenCV python 图片镜像 输入图片 source.jpg 源代码 #!/usr/bin/env python3 # -*- coding: utf-8 -*- ""&q ...

  2. opencv python图片合成视频

    opencv python 图片合成视频 经常用到,记录一下,代码基本上都来自这里这篇博客 只是做了小小的改进,将文件的字符串排序改成了按照文件名排序,合成视频的时候不会乱. 侵删. # -*- co ...

  3. Android OpenCV实现图片叠加,水印

    关于如何用纯OpenCV实现图片叠加的例子实在是太少,太多的是使用 C++,JNI实现的,如果要用C++的话,我们为啥不转行做C++ 下面的例子基于 Android JavaCV 实现了在im_bea ...

  4. 【CV面试】RGB2GRAY、贝叶斯问题、cv2.add和cv2.addWeighted

    目录 1.opencv中RGB2GRAY是怎么实现的 2.贝叶斯问题 3.cv2.add和cv2.addWeighted 1.opencv中RGB2GRAY是怎么实现的 答:以R.G.B为轴建立空间直 ...

  5. opencv python 图片腐蚀和膨胀

    参考:http://blog.csdn.net/yellow_red_people/article/details/53181239 定义一个5x5的结构:kernel=np.uint8(np.zer ...

  6. opencv+python 图片文字识别

    # coding:utf8 import numpy as np import cv2 from PIL import Image import pytesseract import sys # 读取 ...

  7. c++调用opencv实现图片叠加以及添加水印效果

    前言 本篇文章参考了以下文章: https://blog.csdn.net/mars_xiaolei/article/details/78791133 https://answers.opencv.o ...

  8. 【OpenCV 例程200篇】13. 图像的加法运算(cv2.add)

    [OpenCV 例程200篇]13. 图像的加法运算(cv2.add) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  9. Python图片读写方式之OpenCV 图像算术运算

    一.图像加法 (一) cv2.add() import cv2 import numpy as np x = np.uint8([250]) y = np.uint8([14]) print(cv2. ...

  10. Shader学习12——简易图片叠加

    看到蛮牛有人想要两个带透明通道的图片叠加,就是最简单的纹理混合,想想其实实现起来应该很简单,但是搜了一下还真没搜到,这里简单实现一下,要求底图需要是不透明的: image.png image.png ...

最新文章

  1. Matlab编程与数据类型 -- 循环控制语句之二:while/end
  2. 数据库的介绍、分类、作用和特点
  3. Java设计模式(十一):组合设计模式
  4. 数据结构 - 简单选择排序法
  5. VTK:绘图之ChartMatrix
  6. java中的 31 和左移右移的关系简述
  7. theme vscode 护眼_vscode的颜色设置(护眼模式)
  8. 用c 语言写出五子棋的代码,C语言案例:控制台版本的五子棋游戏【代码】
  9. webpack模块化原理-ES module
  10. 挑战程序设计竞赛学习笔记2
  11. 用百度OCR识别URL图片中的文字
  12. Rayson API 框架分析系列之7: 注解处理器(APT)原理
  13. 正则校验手机号,身份证,护照,社会统一信用代码,银行卡号码,传真
  14. ios duang 动画简记
  15. 量子力学最新发现:人不会真正死去
  16. 模拟退火算法详细说明
  17. NC | 西湖大学鞠峰组在聚氯乙烯塑料微生物降解方向取得新突破
  18. jquery 绘图工具 flot 使用
  19. RollBack RX Professional 设置快照教程
  20. 借贷宝java_程序猿去哪儿?——北京JAVA专场

热门文章

  1. ai怎么渐变颜色_ai渐变工具怎么用?Adobe Illustrator渐变颜色实操教程
  2. JavaScript截取文件扩展名
  3. python mro文件_Python中MRO
  4. 硬件电路学习之开尔文电桥双臂讲解
  5. Python flag用法
  6. “无法访问 您可能没有权限使用网络资源”解决办法
  7. 【网络】路由器和交换机区别,什么是网关
  8. 如何找回mysql删除的表_mysql误删表如何恢复,恢复被删除表的步骤说明
  9. linux硬盘坏了无法查看分区,Linux 磁盘坏道检测和修复 查看硬盘坏道代码
  10. 【10】Docker的安装 --Mac