zoukankan      html  css  js  c++  java
  • OpenCV-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 np

    def nothing(x):
    pass

    img1 = 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) & 0xFF
    if k == 27:
    break

    r = cv2.getTrackbarPos('a','image')
    r=float(r)/100.0

    img=cv2.addWeighted(img1,r,img2,1.0-r,0)

    cv2.destroyAllWindows()


    import cv2
    import numpy as np

    import 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()

    原文链接:https://blog.csdn.net/qq_41895190/article/details/82905657

  • 相关阅读:
    反向代理实例
    nginx常用命令和配置
    nginx的安装
    Can Live View boot up images acquired from 64bit OS evidence?
    What is the behavior of lnk files?
    EnCase v7 search hits in compound files?
    How to search compound files
    iOS 8.3 JB ready
    Sunglasses
    现代福尔摩斯
  • 原文地址:https://www.cnblogs.com/Ph-one/p/12190424.html
Copyright © 2011-2022 走看看