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.hqwc.cn/news/151836.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot零食商城管理系统

功能如图所示 摘要 这基于Spring Boot的零食商城管理系统提供了强大的购物车和订单管理功能。用户可以在系统中浏览零食产品,并将它们添加到购物车中。购物车可以保存用户的选购商品,允许随时查看已选择的商品和它们的数量。一旦用户满意,他们…

并发编程 - 并发可见性,原子性,有序性 与 JMM内存模型

1. 并发三大特性 并发编程Bug的源头: 原子性 、 可见性 和 有序性 问题 1.1 原子性 一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。 在 Java 中,对基本数据类型的变量的读取和赋值操作是原子性操…

RabbitMQ-死信交换机和死信队列

1. 简介 DLX: Dead-Letter-Exchange 死信交换器,死信邮箱 2.代码示例 Configuration public class RabbitConfig {final static String exchangeNormalName "exchange.dlx.normal";final static String queueNormalName "queue.dlx.normal"…

如何做好一次代码审查,什么样是一次优秀的代码审查,静态代码分析工具有哪些

代码审查是确保代码质量、提升团队协作效率、分享知识和技能的重要过程。以下是进行优秀代码审查的一些指南: 如何做好代码审查: 理解代码的背景和目的: 在开始审查前,确保你了解这次提交的背景和目的,这有助于更准确…

Android---Bitmap详解

每一个 Android App 中都会使用到 Bitmap,它也是程序中内存消耗的大户,当 Bitmap 使用内存超过可用空间,则会报 OOM。 Bitmap 占用内存分析 Bitmap 用来描述一张图片的长、宽、颜色等信息,可用使用 BitmapFactory 来将某一路径下…

Mac版好用的Git客户端 Fork 免激活

Fork是一款强大的Git客户端软件,在Mac和Windows操作系统上都可以使用。汇集了众多先进的功能和工具,可以帮助用户更方便地管理和控制Git仓库。 Fork的界面简洁直观,易于使用。它提供了许多高级的Git功能,如分支管理、合并、提交、…

【CSS】伪类和伪元素

伪类 :hover:悬停active:激活focus:获取焦点:link:未访问(链接):checked:勾选(表单)first-child:第一个子元素nth-child():指定索引的子元素&…

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题(√)二、2021年真题(√)三、2020年真题(√)四、2019年真题(√)五、2018年真题(√)六、2017年真题(√)七、201…

Proteus仿真--花样流水灯(仿真文件+程序)

本文主要介绍基于51单片机的花样流水灯仿真(完整仿真源文件及代码见文末链接) 仿真运行视频 Proteus仿真--花样流水灯(仿真文件程序) 附完整Proteus仿真资料代码资料 链接: https://pan.baidu.com/s/1coEEBQcTQSzWQiSH_nNiUQ?pw…

C语言_断言assert详解

一、assert定义 assert() 的用法像是一种"契约式编程",在我的理解中,其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个 if 语句: if(假设成立) {程序正常运行&…

算法通关村第三关-白银挑战双指针思想

大家好我是苏麟 , 今天带来算法第三关 . 本期大纲 元素奇偶移动专题汇总区间轮转数组 元素奇偶移动专题 描述 : 给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 题目 …

vxe-table 打包部署上线,校验样式失效

正常效果 打包上线后的样式 样式失效原因,vue版本与vxe-table版本不兼容导致 版本 "vxe-table": "^4.3.5", "vxe-table-plugin-element": "^3.0.6", "xe-utils": "^3.5.4",由于vxe-table最新版本是4…