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

news2024/11/24 9:17:04

一、图像的算术运算

1.1 图像的加法运算

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

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

import cv2
import numpy as np

cat = 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 cv2

cat = 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 cv2
  
  cat = 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 cv2
  
  cat = 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 + 0
  res = 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 cv2
  import numpy as np
  
  cat = 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 cv2
  import numpy as np
  
  cat = 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 cv2
  import numpy as np
  
  #创建一张图片
  img = np.zeros((200,200), np.uint8)
  img2 = np.zeros((200,200), np.uint8)
  
  img[20:120, 20:120] = 255
  img2[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.coloradmin.cn/o/989507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么需要 TIME_WAIT 状态

还是用一下上一篇文章画的图 TCP 的 11 个状态,每一个状态都缺一不可,自然 TIME_WAIT 状态被赋予的意义也是相当重要,咱们直接结论先行 上文我们提到 tcp 中,主动关闭的一边会进入 TIME_WAIT 状态, 另外 Tcp 中的有 …

Vue之scope属性

简介: 在使用Vue脚手架进行开发时,cli编译的时候本质上处理的是一个个文本文件,也就是字符串。每一个组件,即.Vue文件都是一个文本文件,里面包含着模板、组件对象实例以及style样式。组件化开发时,难免会出…

基本导数公式、两个重要极限、x趋于0的等价替换

自然界中,几乎一切事物都可以用函数来描述。我们生活在一个动态变化的世界,对函数求导,可以看出变量之间的变化规律。研究函数与导数有着重要意义,导数可以用于求解函数的极值问题、速度和加速度、切线、法线和曲率等问题&#xf…

LeetCode(力扣)46. 全排列Python

LeetCode46. 全排列 题目链接代码 题目链接 https://leetcode.cn/problems/permutations/ 代码 class Solution:def backtracking(self, nums, result, path, used):if len(path) len(nums):result.append(path[:])for i in range(len(nums)):if used[i]:continuepath.app…

优化VUE Element UI的上传插件

默认ElmentUI的文件列表只有一个删除按钮&#xff0c;我需要加预览、下载、编辑等&#xff0c;就需要优化显示结果。 优化后没用上传进度条&#xff0c;又加了一个进度条效果 代码 <template><div><el-uploadclass"upload-demo"action"/"…

【二分答案 dp】 Bare Minimum Difference

分析&#xff1a; 首先我们能够得知这个优秀值具有单调性&#xff1a; 如果一个优秀值 x 1 x1 x1能够满足题目要求&#xff0c;那么任何 x ( x > x 1 ) x(x>x1) x(x>x1)显然都能符合要求 基于这一特性&#xff0c;我们想到二分答案 直接二分这个答案好像难以维护。 …

PdM和PHM有何区别?

在工业领域&#xff0c;PdM&#xff08;Predictive Maintenance&#xff0c;预测性维护&#xff09;和PHM&#xff08;Prognostics and Health Management&#xff0c;预测与健康管理&#xff09;是两个关键的术语。它们都涉及设备维护和故障预测&#xff0c;但在方法和应用方面…

洛谷 LGR SCP-J 2023 c++语言模拟试题 10. 以下程序片段的时间复杂度为( )

之前在牛客的一个群中看到有位哥们发的题 好像是洛谷哪次的模拟题&#xff0c;还写着什么 LGR SCP-J 2023 c语言模拟试题 题目 就是给段代码询问时间复杂度 for (int i1; i<n; i){for (int j1; j<n; ji){for (int k1; k<n; k j){}} } 跑代码 一开始想不出怎么解就…

实战SpringMVC之CRUD

目录 一、前期准备 1.1 编写页面跳转控制类 二、实现CRUD 2.1 相关依赖 2.2 配置文件 2.3 逆向生成 2.4 后台代码完善 2.4.1 编写切面类 2.4.2 编写工具类 2.4.3 编写biz层 2.4.4 配置mapper.xml 2.4.5 编写相应接口类&#xff08;MusicMapper&#xff09; 2.4.6 处…

小程序的使用

微信小程序开发 外部链接别人的总结查看&#xff08;超详细保姆式教程&#xff09; 基础语法 1.数据绑定 1.1 初始化数据 页面.js的data选项中Page({data: {motto: Hello World,id:18} })使用数据 单项数据流&#xff1a;Mustache 语法 a)模板结构中使用双大括号 {{data}} …

java封装国密SM4为 jar包,PHP调用

java封装国密SM4为 jar包,PHP调用 创建java工程引入SM4 jar包封装CMD可调用jar包PHP 传参调用刚用java弄了个class给php调用,本以为项目上用到java封装功能的事情就结束了,没想到又来了java的加密需求,这玩意上头,毕竟不是强项,没办法,只好再次封装。 但是这次的有点不…

win10系统配置vmware网络NAT模式

1&#xff0c;查看win10 IP地址&#xff1a;ipconfig 2, vmware设置&#xff1a;编辑>>虚拟网络编辑器>>点击添加网络&#xff08;选择NAT模式&#xff09; 3&#xff0c;虚拟机网络设置&#xff1a;点击VMware虚拟机>>设置>>网络适配器 4&#xff…

【常用代码14】el-input输入框内判断正则,只能输入数字,过滤汉字+字母。

问题描述&#xff1a; el-input输入框&#xff0c;只能输入数字&#xff0c;但是不能显示输入框最右边的上下箭头&#xff0c; <el-input v-model"input" type"number" placeholder"请输入内容" style"width: 200px;margin: 50px 0;&…

YOLO总结,从YOLOv1到YOLOv3

YOLOv1 论文链接&#xff1a;https://arxiv.org/abs/1506.02640 检测原理 将检测问题转换成回归问题&#xff0c;一个CNN就搞定。即得到一个框的中心坐标(x, y)和宽高w&#xff0c;h&#xff0c;然后作回归任务。 B是两个框&#xff0c;5是指参数量&#xff0c;x y w h是确定…

港联证券:综合施策提振信心 资本市场新一轮深化改革拉开帷幕

本钱商场新一轮深化变革开放已拉开帷幕。活泼本钱商场“25条”、北交所“深改19条”、标准股份减持行为规定……这些方针举动从出资端、融资端、买卖端等协同发力&#xff0c;既注重短期痛点问题&#xff0c;又着眼久远、安身变革准则完善&#xff0c;有助于构成活泼商场、提振…

2023-9-8 满足条件的01序列

题目链接&#xff1a;满足条件的01序列 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int mod 1e9 7;int qmi(int a, int k, int p) {int res 1;while(k){if(k & 1) res (LL) res * a % p;a (LL) a * a % p;…

2023年软件开发领域的发展趋势

科技趋势引领着软件开发行业的发展。对于开发商来说&#xff0c;将会看到更多的市场增长机会。因此&#xff0c;很多人都想了解软件开发的最新趋势。IT行业正在等待一个范式转变&#xff0c;而科技的好处在于不断发展&#xff0c;势不可挡&#xff0c;并且用途广泛。 很多专业人…

python串口采集数据绘制波形图

这个示例使用 matplotlib 绘制图形&#xff0c;它能够从串口实时读取数据并绘制成波形图。确保你已经替换了 ‘COM11’ 和 9600 为正确的串口号和波特率。 import serial import matplotlib.pyplot as plt from collections import deque import struct# 配置串口参数 ser s…

SpringMVC之CRUD------增删改查

目录 前言 配置文件 pom.xml文件 web.xml文件 spring-context.xml spring-mvc.xml spring-MyBatis.xml jdbc.properties数据库配置文件 generatorConfig.xml log4j2日志文件 后台 PageBaen.java PageTag.java 切面类 biz层 定义一个接口 再写一个实现类 …

vue3嵌套路由keep-alive问题

传统解决方法参考此链接Vue3 嵌套路由中使用 keep-alive缓存多层 - 掘金 我想说的是&#xff1a; 嵌套路由的上级不写componet就行了啊&#xff01;&#xff01;&#xff01;被折磨了两次的顿悟