• OpenCV学习(六)——图像算术运算(加法、融合与按位运算)


    6. 图像算术运算

    6.1 图像加法

    • OpenCV加法是饱和运算
    • Numpy加法是模运算
    import cv2
    import numpy as np
    
    x = np.uint8([250])
    y = np.uint8([10])
    
    # OpenCV加法
    print(cv2.add(x, y))  # 250+10 = 260 => 255
    
    # Numpy加法
    print(x+y)   # 250+10 = 260 % 256 = 4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    请添加图片描述

    6.2 图像融合

    对图像赋予不同的权重,以使其具有融合或透明的感觉。

    图像融合:dst = α*img1 + β*img2 + γ

    cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)

    • src1:图像1
    • alpha:图像1的权重
    • src2:图像2
    • beta:图像2的权重
    import cv2
    from matplotlib import pyplot as plt
    
    # 读取图像
    img1 = cv2.imread('lena.jpg')  # (512, 512, 3)
    img2 = cv2.imread('opencv.jpg')  # (536, 536, 3)
    
    print(img1.shape)
    print(img2.shape)
    
    # 改变尺寸
    img2 = cv2.resize(img2, (512, 512))
    
    # 图像融合:dst = α*img1 + β*img2 + γ
    # α:img1的权重,β:img2的权重
    dst = cv2.addWeighted(img1, 0.8, img2, 0.2, 0)
    
    # 显示多张图像
    plt.subplot(131), plt.title("1. img1"), plt.axis('off')
    plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))  # 显示 img1(RGB)
    plt.subplot(132), plt.title("2. img2"), plt.axis('off')
    plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))  # 显示 img2(RGB)
    plt.subplot(133), plt.title("dst. img3"), plt.axis('off')
    plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))  # 显示 img2(RGB)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    请添加图片描述

    6.3 按位运算

    这包括按位 ANDORNOTXOR 操作。

    cv2.bitwise_and(src1, src2, dst=None, mask=None)计算两个数组或数组的逐元素按位连进行与运算

    • scr1,scr2:输入图像,可为灰度图或彩色图,src1 和 src2 大小需一样。
    • dst:输出图像,尺寸和类型与 src 保持一致。
    • mask:掩膜,只对 mask 设定的有效区域进行操作。

    cv2.threshold(src, thresh, maxval, type, dst=None)图像阈值

    • src:源图像,应该为灰度图。
    • thresh:阈值,像素值小于阈值,则将其设置为0,否则将其设置为最大值。
    • maxval:分配给超过阈值的像素值的最大值。
    • type:提供了不同类型的阈值
      • cv.THRESH_BINARY
      • cv.THRESH_BINARY_INV
      • cv.THRESH_TRUNC
      • cv.THRESH_TOZERO
      • cv.THRESH_TOZERO_INV
    • dst:输出图像
    import cv2
    from matplotlib import pyplot as plt
    
    # 读取图像
    img1 = cv2.imread('lena.jpg')  # (512, 512, 3)
    img2 = cv2.imread('opencv.jpg')  # (536, 536, 3)
    
    # 提取OpenCV标志,将其缩小后放在img1的左上角
    img2 = cv2.resize(img2, (200, 200))
    rows, cols, channels = img2.shape
    # 创建roi区域
    roi = img1[0:rows, 0:cols]
    # 现在创建logo的掩码,并同时创建其相反掩码
    img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask)
    
    # 现在将ROI中logo的区域涂黑,即像素值为0
    img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
    # 仅从logo图像中提取logo区域
    img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
    # 将logo放入ROI并修改主图像
    dst = cv2.add(img1_bg, img2_fg)
    img1[0:rows, 0:cols] = dst
    
    # 显示多张图像
    plt.subplot(231), plt.title("mask. img1"), plt.axis('off')
    plt.imshow(cv2.cvtColor(mask, cv2.COLOR_GRAY2RGB))  # 显示 img1(RGB)
    plt.subplot(232), plt.title("mask_inv. img2"), plt.axis('off')
    plt.imshow(cv2.cvtColor(mask_inv, cv2.COLOR_GRAY2RGB))  # 显示 img2(RGB)
    plt.subplot(233), plt.title("img1_bg. img3"), plt.axis('off')
    plt.imshow(cv2.cvtColor(img1_bg, cv2.COLOR_BGR2RGB))  # 显示 img2(RGB)
    
    plt.subplot(234), plt.title("img2_fg. img4"), plt.axis('off')
    plt.imshow(cv2.cvtColor(img2_fg, cv2.COLOR_BGR2RGB))  # 显示 img2(RGB)
    plt.subplot(235), plt.title("dst. img5"), plt.axis('off')
    plt.imshow(cv2.cvtColor(dst, cv2.COLOR_BGR2RGB))  # 显示 img2(RGB)
    plt.subplot(236), plt.title("img1. img6"), plt.axis('off')
    plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))  # 显示 img2(RGB)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    1. 在img2中创建opencv的掩码与反掩码
    2. 在img1中设定roi区域
    3. 利用位的与运算将roi区域的logo涂黑(像素值为0,利用掩码)
    4. 提取img2中的opencv标志(利用反掩码)
    5. 将opencv放入roi并修改主图像(像素值相加)

    请添加图片描述

  • 相关阅读:
    SyntaxError: EOL while scanning string literal
    unity---Mesh网格编程(六)
    Unity反编译:IL2CPP 打包输出的cpp文件和dll(程序集)位置、Mono打包输出的dll(程序集)位置
    蓝牙 - 注册SIG账号
    YOLOV7实战(pycharm)-以口罩检测为例
    ElasticSearch ( 二 ) 基本概念
    初步上手Git软件及GitHub平台:基本操作方法
    图解Nginx,系统架构演变 + Nginx反向代理与负载均衡
    通过pyserial操作串口
    知识点3--CMS项目查看文章详情
  • 原文地址:https://blog.csdn.net/qq_38473254/article/details/134095278