当前位置: 首页 > news >正文

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

图像算术运算

    • 6. 图像算术运算
      • 6.1 图像加法
      • 6.2 图像融合
      • 6.3 按位运算

6. 图像算术运算

6.1 图像加法

  • OpenCV加法是饱和运算
  • Numpy加法是模运算
import cv2
import numpy as npx = 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

请添加图片描述

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()

请添加图片描述

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)图像阈值(见OpenCV学习(9))

  • 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. 在img2中创建opencv的掩码与反掩码
  2. 在img1中设定roi区域
  3. 利用位的与运算将roi区域的logo涂黑(像素值为0,利用掩码)
  4. 提取img2中的opencv标志(利用反掩码)
  5. 将opencv放入roi并修改主图像(像素值相加)

请添加图片描述

http://www.lryc.cn/news/209594.html

相关文章:

  • 如何做好一次代码审查,什么样是一次优秀的代码审查,静态代码分析工具有哪些
  • 【Android】一个contentResolver引起的内存泄漏问题分析
  • 2023年正版win10/win11系统安装教学(纯净版)
  • 系统架构设计师-第11章-未来信息综合技术-软考学习笔记
  • Python __new__()方法详解
  • 虹科 | 解决方案 | 汽车示波器 索赔管理方案
  • 详解Jmeter中的BeanShell脚本
  • 前端和后端 优化
  • C++编译与运行:其二、编译期和运行期的区别
  • 汽车电子专有名词与相应技术
  • idea 没加载 provided的包
  • Hover:借贷新势力崛起,在经验与创新中找寻平衡
  • 软件设计原则-依赖倒置原则讲解以及代码示例
  • Linux--进程替换
  • 【计算机网络】TCP协议
  • 机器学习数据集:Kaggle
  • 软考 系统架构设计师系列知识点之设计模式(4)
  • PyCharm 安装 cx_Oracle 失败
  • 解决Windows出现找不到mfcm90u.dll无法打开软件程序的方法
  • 如何设计线程安全的 HashMap?
  • rpc汇总
  • OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)
  • 指针仪表读数YOLOV8NANO
  • 10000字!图解机器学习特征工程
  • Java 官方提供了哪几种线程池,分别有什么特点?
  • DTI-ALPS处理笔记
  • LVS集群-NAT模式
  • 微服务技术导学
  • p5.js 开发点彩画派的绘画工具
  • Java工具库——Commons IO的50个常用方法