• opencv2——图像上的算术运算4


    1.图像算术运算

    参数含义:

    • src1:第一张图像
    • src2:第二张图像
    • dst:destination,目标图像,需要提前分配空间,可省略
    • mask:掩膜
    • scale:缩放比,常量
    • dtype:数据类型,默认等于-1
    cv2.add(src1,src2,dst,mask,dtype) cv2.subtract(src1,src2,dst,mask,dtype) cv2.multiply(src1,src2,dst,scale,dtype) cv2.divide(src1,src2,dst,scale,dtype)
    dst = src1 + src2 dst = src1 - src2 dst = scale * src1 * src2 dst = scale * src1 / src2

     

    实例演示:

     1 import cv2
     2 import numpy as np
     3 from matplotlib import pyplot as plt
     4 
     5 x = np.uint8([250])
     6 y = np.uint8([10])
     7 print(cv2.add(x, y))  #饱和运算
     8 print(x + y)   #求余运算(x+y)%255
     9 
    10 img1 = cv2.imread('a.jpg')  # 图片1
    11 img2 = cv2.imread('b.jpg')  # 图片2
    12 add = cv2.add(img1, img2)  # 两个图像相加
    13 subtract = cv2.subtract(img1, img2)  # 两个图像相减
    14 multiply = cv2.multiply(img1, img2)  # 两个图像相乘
    15 divide = cv2.divide(img1, img2)  # 两个图像相除
    16 
    17 plt.subplot(231), plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB), 'gray'), plt.title('img1')
    18 plt.subplot(232), plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB), 'gray'), plt.title('img2')
    19 plt.subplot(233), plt.imshow(cv2.cvtColor(add, cv2.COLOR_BGR2RGB), 'gray'), plt.title('add')
    20 plt.subplot(234), plt.imshow(cv2.cvtColor(subtract, cv2.COLOR_BGR2RGB), 'gray'), plt.title('subtract')
    21 plt.subplot(235), plt.imshow(cv2.cvtColor(multiply, cv2.COLOR_BGR2RGB), 'gray'), plt.title('multiply')
    22 plt.subplot(236), plt.imshow(cv2.cvtColor(divide, cv2.COLOR_BGR2RGB), 'gray'), plt.title('divide')
    23 plt.show()

     

     

    2.图像混合(线性加法)

    这也是加法,不同的是两幅图像的权重不同,这会给人一种混合或者透明的感觉。图像混合的计算公式如下:

    g(x) = (1−α)f0 (x)+αf1 (x)
    通过修改α的值(0-->1),可以实现很酷的混合。
    例:将两幅图像混合,第一幅权重为0.7.第二幅权重为0.3。函数cv2.addWeighed()可以按下面的公式对图片进行混合。
    dst = α·img1 + β·img2+γ
    这里γ的取值为0

     1 import cv2
     2 import numpy as np
     3 img1=cv2.imread('45.jpg')
     4 img2=cv2.imread('messigray.png')
     5 
     6 dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
     7 
     8 cv2.imshow('dst',dst)
     9 cv2.waitKey(0)
    10 cv2.destroyAllWindows()

     3.按位运算

    这里包括按位操作有:AND,OR,NOT,XOR等,当我们提取图像的一部分,选择非矩形ROI时,会很有用。下面进行如何改变一幅图的特定区域。

    (1)cv2.bitwise_and(src1,src2,dst,mask)

    输出两个图像的交集:dst = src1 & src2

    (2)cv2.bitwise_or(src1,src2,dst,mask)

    输出两个图像的并集:dst = src1 | src2

    (3)cv2.bitwise_not(src,dst,mask)

    输出图像的非:dst = - src

    (4)cv2.bitwise_xor(src1,src2,dst,mask)

    输出两个图像的异或:dst = src1 ^ src2

     1 import cv2
     2 import numpy as np
     3 from matplotlib import pyplot as plt
     4 
     5 img1 = cv2.imread('1.jpg')[0:375,0:500]  # 图片1
     6 img2 = cv2.imread('2.jpg')  # 图片2
     7 band = cv2.bitwise_and(img1, img2)  # 两个图像求交
     8 bor = cv2.bitwise_or(img1, img2)  # 两个图像求并
     9 bnot = cv2.bitwise_not(img1)  # 图像求非
    10 bxor = cv2.bitwise_xor(img1, img2)  # 两个图像求异或
    11 
    12 title = ['img1', 'img2', 'and', 'or', 'not', 'xor']
    13 images = [img1, img2, band, bor, bnot, bxor]
    14 for i in range(6):
    15     plt.subplot(2, 3, i+1)
    16     plt.imshow(cv2.cvtColor(images[i], cv2.COLOR_BGR2RGB), 'gray'), plt.title(title[i])
    17 plt.show()

     

  • 相关阅读:
    IDEA 基本配置
    IDEA 创建一个普通的java项目
    Intellij Idea 创建一个Web项目
    override的实现原理
    elasticsearch 复杂查询小记
    post 中文数据到elasticsearch restful接口报json_parse_exception 问题
    String intern()方法详解
    JVM的DirectMemory设置
    深入浅出 JIT 编译器
    为什么 JVM 不用 JIT 全程编译
  • 原文地址:https://www.cnblogs.com/weststar/p/11510901.html
Copyright © 2020-2023  润新知