• 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

  • 相关阅读:
    java对redis的基本操作
    关于Java异常和错误的几个问题
    「hadoop」fs.defaultFS 9000 端口在外面连不上
    「ubuntu」修改权限和owner命令
    「ubuntu」pkexec超级修改权限
    「ubuntu」vim 基本使用
    「ubuntu」修改主机名
    「hadoop」ssh
    「vmware」虚拟机与主机共享目录
    「spring」定时任务(纯注解方式)
  • 原文地址:https://www.cnblogs.com/Ph-one/p/12190424.html
Copyright © 2020-2023  润新知