zoukankan      html  css  js  c++  java
  • OpenCV学习系列教程第四篇:图像的算术操作

    来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解

    本文由作者翻译并进行代码验证,转载请注明出处~

    官方文档请参阅:https://docs.opencv.org/4.0.1/d0/d86/tutorial_py_image_arithmetics.html

    运行环境:

    windows 10+pycharm professional 2018.3+python 3.7.1+opencv 4.0.1

    目标:

    1,学习opencv对图像的操作,比如加,减和按位操作等

    2,学习cv.add()和cv.addWeighted()函数

    一:图像的加运算操作

    您可以通过cv.add()函数对两张图片做加运算操作,也可以使用numpy的方式,即res=img1+img2.进行加运算操作,要求两张图片的深度和类型必须一致,或者第二张图片只是一个标量值。

    值得注意的是:OpenCV和numpy对于图像的加运算操作是不同的。opencv是饱和运算:即运算结果超过最大值之后,直接取最大值。而numpy是模运算:即运算结果超出最大值之后,取模运算。代码如下:

    import numpy as np
    import cv2 as cv
    x = np.uint8([250])
    print(x)
    y = np.uint8([10])
    print(y)
    print( cv.add(x,y) ) 
    # 250+10 = 260 => 255
    print( x+y )         
    # 250+10 = 260 % 256 = 4

    二:图像混合

    图像的混合,主要是采用以下公式来实现的:

    g(x)=(1α)f0(x)+αf1(x)

    示例代码如下:

    import cv2 as cv
    img = cv.imread('C:\Users\xjtu\Desktop\1.png')
    img1 = cv.imread('C:\Users\xjtu\Desktop\roi.jpg')
    res = cv.resize(img,(600,500),interpolation=cv.INTER_CUBIC)
    res1 = cv.resize(img1,(600,500),interpolation=cv.INTER_CUBIC)
    dst = cv.add(res,res1)
    cv.imshow('opencv',dst)
    cv.waitKey(0)
    cv.destroyAllWindows()

    运行截图如下:

     三:位运算

    这主要包括AND,OR,NOT,XOR操作。这在提取图片任何区域(后续章节中会讲到)、定义和使用非矩形ROI等时是非常有用的。代码如下:

    import cv2 as cv
    img2=cv.imread('C:\Users\xjtu\Desktop\1.png')
    img1=cv.imread('C:\Users\xjtu\Desktop\roi.jpg')
    print(img2.shape)
    img2=cv.resize(img2,(100,80),interpolation=cv.INTER_CUBIC)
    print(img2.shape)
    # 读取出image2的像素值,并在image1创造roi区域
    rows,cols,channels=img2.shape
    roi=img1[0:rows,0:cols]
    img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
    # threshold函数是图像的二值化操作
    ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
    mask_inv = cv.bitwise_not(mask)
    
    # Now black-out the area of logo in ROI
    img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
    # Take only region of logo from logo image.
    img2_fg = cv.bitwise_and(img2,img2,mask = mask)
    # Put logo in ROI and modify the main image
    dst = cv.add(img1_bg,img2_fg)
    img1[0:rows, 0:cols ] = dst
    cv.imshow('res',img1)
    cv.waitKey(0)
    cv.destroyAllWindows()

    运行截图如下:

     

     2019年1月12日第一次修改:

    1、bitwise_not     是取反操作。通过输出mask和mask_inv可以看出结果。

  • 相关阅读:
    csrf跨站请求伪造
    IO 之 InputStream 和 Reader
    javadoc tags
    java this
    递归
    java 文件中 定义一个字符串,它的默认编码是什么?
    合并数组
    << 移位运算
    final static T
    Base64.java 工具类
  • 原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/10257369.html
Copyright © 2011-2022 走看看