OpenCV 05(图像的算术与位运算)

一、图像的算术运算

1.1 图像的加法运算

- add  opencv使用add来执行图像的加法运算

图片就是矩阵, 图片的加法运算就是矩阵的加法运算, 这就要求加法运算的两张图shape必须是相同的.

import cv2
import numpy as npcat = cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\cat.jpeg')
dog = cv2.imread('D:\\3-project\\zyj\\pythonCNN\\pic\\dog.jpeg')print(cat.shape)
print(dog.shape)
cat1=cat[:360, :499]
print(cat1.shape)new_img= cv2.add(cat1, dog)cv2.imshow('new',new_img)
cv2.waitKey(0)

另外一种写法: 

# 图片加法
import cv2cat = cv2.imread('./cat.jpeg')
dog = cv2.imread('./dog.jpeg')# 加法要求两个图片大小一致
print(cat.shape)
print(dog.shape)
# 把猫的图片变小
# 注意坑. opencv中resize中传递新的宽度和高度, 先宽度再高度, 所有是先列后行, 和shape的输出反了.
new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))
# 和单个数字运算, 超过255 会被截断, 相当于 % 256
print(new_cat[0:5, 0:5])
print(new_cat[0:5, 0:5] + 100) 
cv2.imshow('cat_dog', np.hstack((new_cat, dog)))
# 加法, 加法的效果是加起来如果超过255, 统一变成255
new_img = cv2.add(new_cat, dog)
print(new_img[0:5, 0:5])
cv2.imshow('cat_dog', np.hstack((new_cat, dog, new_img)))cv2.waitKey(0)
cv2.destroyAllWindows()

 opencv中resize中传递新的宽度和高度, 先宽度再高度, 所有是先列后行, 和shape的输出反了

`dog.shape[:-1]` 它用于获取图像的高度和宽度,但排除了通道数(如果图像是多通道的话)。

假设 `dog` 是一个图像,那么 `dog.shape` 将返回一个包含三个值的元组,通常形式为 `(height, width, channels)`,

通过使用切片 `[:-1]`,我们从形状元组中排除了最后一个元素(通道数),因此得到一个包含高度和宽度的子元组,即 `(height, width)`。

 

`dog.shape[::-1]` 是一个 Python 表达式,用于反转图像 `dog` 的形状信息。让我解释这个表达式的含义:

1. `dog.shape`:这部分获取图像 `dog` 的形状信息。`shape` 是一个属性,用于获取图像的维度信息。通常,它返回一个元组,其中包含三个值,分别表示高度、宽度和通道数。例如,对于彩色图像,形状可能是 `(height, width, channels)`。

2. `[::-1]`:这是 Python 的切片(slicing)操作,它将元组中的元素反转顺序。在这里,它用于交换元组中的元素位置,将 `(height, width, channels)` 变成了 `(channels, width, height)`。

综合起来,`dog.shape[::-1]` 返回一个反转后的形状元组,通常用于将图像的形状信息调整为某些库或函数的期望输入格式。这种操作在图像处理和计算机视觉任务中可能会有用,特别是当需要将通道数移动到元组的第一个位置时。

 

# 缩小图像到新尺寸 (width, height)

new_size = (300, 200)

resized_image = cv2.resize(image, new_size)

# 放大图像到新尺寸 (width, height)

new_size = (600, 400)

resized_image = cv2.resize(image, new_size) 

1.2 图像的减法运算

- subtract 

- opencv使用subtract来执行图像的减法运算, 图像对应位置的元素相减, 如果减完小于0, 统一变成0. 

import cv2cat = cv2.imread('./cat.jpeg')dog = cv2.imread('./dog.jpeg')# 加法要求两个图片大小一致print(cat.shape)print(dog.shape)# 把猫的图片变小# 注意坑. opencv中resize中传递新的宽度和高度, 先宽度再高度, 所有是先列后行, 和shape的输出反了.new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))# 减法new_img = cv2.subtract(new_cat, dog)print(new_cat[0:5, 0:5], dog[0:5, 0:5])print(new_img[0:5, 0:5])cv2.imshow('cat_dog', np.hstack((new_cat, dog, new_img)))cv2.waitKey(0)cv2.destroyAllWindows()

同样的还有乘法, 除法运算. cv2.mutiply, cv2.divide

1.3 图像的融合

- cv2.addWeighted(src1, alpha, src2, beta, gamma)

- 图片的融合操作相当于对图片进行线性运算  w1* x1 + w2 * x2 + b. 其中alpha是第一个权重参数, beta是第二个权重参数, gamma是偏差.

  import cv2cat = cv2.imread('./cat.jpeg')dog = cv2.imread('./dog.jpeg')new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))# 相当于res = new_cat * 0.4 + dog * 0.6 + 0res = cv2.addWeighted(new_cat, 0.4, dog, 0.6, 0)cv2.imshow('cat_dog', np.hstack((new_cat, dog, res)))cv2.waitKey(0)cv2.destroyAllWindows()

二、OpenCV的位运算

bitwise_not(img)  非操作的效果就相当于是用 255 -  img

  import cv2import numpy as npcat = cv2.imread('./cat.jpeg')dog = cv2.imread('./dog.jpeg')cat_not = cv2.bitwise_not(cat)cat_not_not = cv2.bitwise_not(cat_not)cv2.imshow('not', np.hstack((cat, cat_not, cat_not_not)))print(cat[:3, :3])print(cat_not[:3, :3])print(cat_not_not[:3, :3]cv2.waitKey(0)cv2.destroyAllWindows()

- bitwise_and(img1, img2) 与运算, 图片对应位置元素进行与操作. 表现出来的效果就是黑和黑与还是黑, 白和白与还是白.

  import cv2import numpy as npcat = cv2.imread('./cat.jpeg')dog = cv2.imread('./dog.jpeg')new_cat = cv2.resize(cat, (dog.shape[:-1][::-1]))cat_and_dog = cv2.bitwise_and(new_cat, dog)cv2.imshow('not', np.hstack((new_cat, cat_and_dog)))print('cat:', new_cat[:3, :3])print('-----------')print('dog:', dog[:3, :3])print('-----------')print(cat_and_dog[:3, :3])cv2.waitKey(0)cv2.destroyAllWindows()

- bitwise_or  或运算 对应元素做或运算

- bitwise_xor 异或运算 对应元素做异或运算

  import cv2import numpy as np#创建一张图片img = np.zeros((200,200), np.uint8)img2 = np.zeros((200,200), np.uint8)img[20:120, 20:120] = 255img2[80:180, 80:180] = 255#new_img = cv2.bitwise_bit(img)#new_img = cv2.bitwise_and(img, img2)#new_img = cv2.bitwise_or(img, img2)new_img = cv2.bitwise_xor(img, img2)cv2.imshow('new_img', new_img)cv2.imshow('img', img)cv2.imshow('img2', img2)cv2.waitKey(0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127425.html

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

相关文章

libbpf-bootstrap安卓aarch64适配交叉编译

1.为什么移植 疑惑 起初我也认为,像libbpf-bootstrap这样在ebpf程序开发中很常用的框架,理应支持不同架构的交叉编译。尤其是向内核态的ebpf程序本身就是直接通过clang的-target btf直接生成字节码,各个内核上的ebpf虚拟机大同小异&#xf…

音频——I2S DSP 模式(五)

I2S 基本概念飞利浦(I2S)标准模式左(MSB)对齐标准模式右(LSB)对齐标准模式DSP 模式TDM 模式 文章目录 DSP formatDSP A时序图逻辑分析仪抓包 DSP B时序图逻辑分析仪抓包 DSP format DSP/PCMmode 分为 Mode-A 和 Mode-B 共 2 种模式。不同芯⽚有的称为 PCM mode 有的称为 DSP m…

UG二次开发 向量叉乘 UF_VEC3_cross

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG二次开发 向量叉乘 UF_VEC3_cross,xyz三个向量已知2个求另外1个。 效果: 代码: #include "me.hpp"void ufusr(char* param, int* retcode, int paramLe…

数据结构与算法学习(day4)——解决实际问题

前言 在本章的学习此前,需要复习前三章的内容,每个算法都动手敲一遍解题。宁愿学慢一点,也要对每个算法掌握基本的理解! 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法,今天我们来实践一下前面的三种算法。…

C# OpenVinoSharp PP-TinyPose 人体姿态识别

效果 项目 部分代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;name…

机器学习——支持向量机(SVM)

机器学习——支持向量机(SVM) 文章目录 前言一、SVM算法原理1.1. SVM介绍1.2. 核函数(Kernel)介绍1.3. 算法和核函数的选择1.4. 算法步骤1.5. 分类和回归的选择 二、代码实现(SVM)1. SVR(回归&a…

【矩阵分解】PCA - 主成分分析中的数学原理

前言 本文主要对PCA主成分分析中的数学原理进行介绍,将不涉及或很少涉及代码实现或应用,阅读前请确保已了解基本的机器学习相关知识。 文章概述 PCA主成分分析属于矩阵分解算法中的入门算法,通过分解特征矩阵来实现降维。 本文主要内容&a…

硬件学习件Cadence day13 PCB设计中一些设置, 铜皮到钻孔的距离设置, 差分线的设置,板层信息表

1. 设置铺铜中铜皮到钻口,连线的距离。 1. 打开设置界面 2. 设计界面 调整到 铜皮设置界面 2. 高速线的设置 (差分对传输线的设置) 1. 打开设置界面 2. 来到 差分线设置界面 3. 把界面往右看, 设置差分线的之间距离,…

(二十四)大数据实战——Flume数据流监控之Ganglia的安装与部署

前言 本节内容我们主要介绍一下Flume数据流的监控工具Ganglia。Ganglia是一个开源的分布式系统性能监控工具。它被设计用于监视大规模的计算机群集(包括集群、网格和云环境),以便收集和展示系统和应用程序的性能数据。Ganglia 可以轻松地扩展…

【多线程】线程安全 问题

线程安全 问题 一. 线程不安全的典型例子二. 线程安全的概念三. 线程不安全的原因1. 线程调度的抢占式执行2. 修改共享数据3. 原子性4. 内存可见性5. 指令重排序 一. 线程不安全的典型例子 class ThreadDemo {static class Counter {public int count 0;void increase() {cou…

3D点云测量:计算三个平面的交点

文章目录 0. 测试效果1. 基本内容文章目录:3D视觉测量目录0. 测试效果 1. 基本内容 计算三个平面的交点需要找到满足所有三个平面方程的点。三个平面通常由它们的法向量和通过它们的点(或参数形式的方程)来定义。以下是计算三个平面的交点的一般步骤: 假设有三个平面,分别…

MyBatis-Plus排除不必要的字段

查询学生信息排除年龄列表 📚🔍 使用MyBatis-Plus排除某些字段。如果你想要进行查询,但又不需要包含某些字段,那么这个功能将非常适合你。🔍🎓📝 1. 学生信息查询-排除年龄列表 在使用 MyBat…

【Cisco Packet Tracer】管理方式,命令,接口trunk,VLAN

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

【Redis】为什么要学 Redis

文章目录 前言一、Redis 为什么快二、Redis 的特性2.1 将数据储存到内存中2.2 可编程性2.3 可扩展性2.4 持久性2.5 支持集群2.6 高可用性 三、Redis 的应用场景四、不能使用 Redis 的场景 前言 关于为什么要学 Redis 这个问题,一个字就可以回答,那就是&…

Vue3+Ts+Vite项目(第一篇)——使用Vite创建Vue3项目

概述 保姆级详解,带你使用 Vite 创建 Vue3 项目,全程cv即可 文章目录 概述一、 安装 Vite二、 创建项目2.1 运行上述命令后,会让我们输入项目名称。可以写一个 vue3-study2.2 选择项目模板,此处选择 Vue,然后回车确定…

mysql课堂笔记 mac

目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…

深入浅出AXI协议(6)——传输属性

一、前言 在之前的文章中,我们介绍的主要内容是AXI协议的数据读写结构和读写响应结构,主要讲述了当遇到各种特殊情况时,AXI如何完成数据的读写操作,最后介绍了读写响应的4种类型。 在本文中,我们将介绍AXI协议的传输属性。 二、传…

【C++】day3学习成果:类

1.自行封装一个栈的类,包含私有成员属性:栈的数组、记录栈顶的变量 成员函数完成:构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 头文件stack.h: #ifndef STACK_H #define STACK_H#include …

Linux常见指令

目录 前言 一、Linux下的基本指令 01. ls 指令 02. pwd 指令 03. cd 指令 04. touch 指令 05. mkdir 指令(重要) 06. rmdir 指令 && rm 指令(重要) 07. man 指令(重要) extra nano 08. cp 指…

并发聊天服务器编写

并发聊天服务器 package mainimport ("fmt""net""strings""time" )// 结构体 type Client struct {C chan string //用户发送数据的管道Name string //用户名Addr string //网络地址 }// 保存在线用户 cliAddr -->cli…