zoukankan      html  css  js  c++  java
  • OpenCV学习笔记(4)——图像上的算术运算

    • 学习图像上的算术运算,加法,减法,位运算等

    1.图像加法

      使用cv2.add()将两幅图像进行加法运算,也可以用numpy运算,直接img+img1。两幅图像的大小和类型必须一致,或者第二个图像可以是一个简单的标量值。

      两种操作的本质区别在于OpenCV的加法是一种饱和操作,加到顶后就不在上升了;而Numpy是模操作,具体如下:

    import numpy as np
    import cv2

    x = np.uint8([250])
    y = np.uint8([10])
    print(cv2.add(x,y))
    print(x+y)
      

    #[[255]]
    #[4] 相当于(255+10)%256 = 4

    在具体对两幅图像操作时会更加明显。一般来说OpenCV的结果会好一些,因此一般用OpenCV的函数

    2.图像混合

    即带权加法,可以将两幅图混合给人一种透明或者混合的感觉。具体公式很简单:

    具体实现是用cv2.addWeighted(),例程如下:

    import numpy as np
    import cv2

    img1 = cv2.imread('20180705-153550.jpg')
    img2 = cv2.imread('20180708-085334.jpg')

    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    cv2.waitKey(0)

    dst = cv2.addWeighted(img1, 0.7, img2, 0.3,0)#第一个数字是第一幅图的权值,第二个数字是第二幅图的权值,最后一个是个常数γ值

    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     在使用这个函数时,注意两幅图必须尺寸要相同,否则会报错

    3.按位运算

      包括按位操作有:AND,OR,NOT,XOR等。提取图片一部分的时候会很有用。比如有要将一个logo的中间部分挖掉放到另一个图里,使用简单的ROI操作是办不到的。

    import numpy as np
    import cv2

    img1 = cv2.imread('5.jpg')
    img2 = cv2.imread('2.jpg')

    #先将背景图中和logo图大小相同的部分挖出来
    rows, cols, channels = img2.shape
    roi = img1[0:rows, 0:cols]
    cv2.imshow('roi',roi)
    cv2.waitKey(0)

    img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

    #对logo图设置掩码或反掩码,方便后面从背景抠出logo部分,已及从logo图中单独抠出logo
    ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)#threshold的用法,第一位为原图(只能是单通道图一般为灰度图),第二个是阈值,大于阈值的像素点取第三位的数字,最后一个是二值化操作类型
    mask_inv = cv2.bitwise_not(mask)#按位NOT运算
    cv2.imshow('mask',mask)
    cv2.imshow('mask_inv',mask_inv)
    cv2.waitKey(0)

    #分别从背景中抠出logo的位置,以及从logo图中抠出logo
    img1_bg = cv2.bitwise_and(roi,roi,mask = mask)#自己与自己AND运算,mask的作用在于前面两幅图AND后再与掩码做AND,使原图中掩码为1的像素变为1(全黑)
    img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
    cv2.imshow('bg',img1_bg)
    cv2.imshow('fg',img2_fg)
    cv2.waitKey(0)

    dst = cv2.add(img1_bg,img2_fg)%结合背景和logo
    img1[0:rows,0:cols] = dst

    cv2.imshow('res',img1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    最终效果为


  • 相关阅读:
    前端 http协议 四大特性 web本质 -响应状态码 列表标签 表单操作 form表单 # 44 HTML
    断点传续 # 补充 mysql
    优酷系统 # 41-43
    css控制 只显示一行 强制不换行 超出用...表示
    点击返回上一页面
    jquery实现点击按钮变换背景颜色
    js,同意后,才可已点击注册按钮
    用div+css生存太极图案
    使用tp5,显示页面错误信息
    vue项目搭建步骤
  • 原文地址:https://www.cnblogs.com/zodiac7/p/9279314.html
Copyright © 2011-2022 走看看