Opencv之计算机视觉一

一、环境准备

使用opencv库来实现简单的计算机视觉。

需要安装两个库:opencv-python和opencv-contrib-python,版本可以自行选择,注意不同版本的opencv中的某些函数名和用法可能不同

pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simplee


二、读取图片文件

1、使用pillow这个库中的功能

from PIL import Image
aa=Image.open('timg98.jpg')
print(aa)

2、使用opencv中特有的读取文件的方法 

import cv2  # 读取的格式是BGR  numpy
import matplotlib.pyplot as plt  # matplotlib读取的格式与opencv不同
import numpy as np# '''-------------------读取图片----------------------------'''
a = cv2.imread('timg98.jpg')#读取图片
# print(a)   #  NumPy数组,其中存储了读取的图像文件的像素值。
cv2.imshow('tu',a)  #显示图片。显示图片的名称,显示的图片数据。将图片以窗口的形式显示,后边的参数第一个参数是窗口名,第二个参数是保存图片数据的变量b = cv2.waitKey(0)#这里的waitkey函数是设置将里面的数字为非零数,则是指经过多ms后图片窗口会关闭,#如果里面的数字为0,则是窗口永久不会关闭,按下任意键时才会关闭
# # 当里面的参数设置为0时,waitkey这个函数会返回按下按键的ASCII码的数值print(b) #显示ASCII的数值,可以对应ASCII的表来查找对应的数值cv2.destroyAllWindows() #摧毁这个窗口,减少内存的占用,上面的waitkey已经关闭了窗口,在这里可以不用写,但是在一些大的项目中,为了防止内存占用,往往需要添加。# # '''调试模型观察shape,dtype、size属性'''print("图像形状 (shape):", a.shape)   #高、宽、通道数
print("图像数据类型 (dtype):", a.dtype) #无符号 8 位整数,用于表示像素值的范围在 0 到 255 之间。
print("图像大小 (size):", a.size) #表示图像的大小,通常是一个整数,表示图像的总像素数,即图像的高度乘以宽度乘以通道数

3、读取图片的灰度图

c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE) ,其中cv2.IMREAD_GRAYSCALE是设置imread读取图片是设置图片为灰度图,如果后面设置为0,则显示彩色图片,不写效果也是彩色。

c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE)     #读取图片
c=cv2.resize(c,(500,500))           #图片原尺寸过大,所以这里对图片的大小进行重新设置cv2.imshow("tupian",c)      #将图片以窗口的形式显示,后边的参数第一个参数是窗口名,第二个参数是图片的来源b=cv2.waitKey(0)    #这里的waitkey函数是设置将里面的数字为非零数,则是指经过多ms后图片窗口会关#闭,如果里面的数字为0,则是窗口永久不会关闭,按下任意键时才会关闭
# # 当里面的参数设置为0时,waitkey这个函数会返回按下按键的ASCII码的数值print(b)    #显示ASCII的数值,可以对应ASCII的表来查找对应的数值cv2.destroyAllWindows()     #摧毁这个窗口,减少内存的占用,上面的waitkey已经关闭了窗口,在这里可#以不用写,但是在一些大的项目中,为了防止内存占用,往往需要添加print("图像的形状:",c.shape)print("图像的数据类型:",c.dtype)print("图像的大小:",c.size)#图片的保存,后面的两个参数,第一个是图片保存的位置,第二个是图片储存的变量
cv2.imwrite('tupian_gray.jpg',b)

4、视频文件的读取

import cv2
# 打开视频文件
video_capture = cv2.VideoCapture('转场.mp4')  #  摄像头:0
# 检查视频是否成功打开
if not video_capture.isOpened():print("无法打开视频文件")exit()
# 循环读取视频帧
while True:# 逐帧读取视频ret, frame = video_capture.read()  #ret是布尔值,表示是否成功读取了帧,frame 是读取到的帧# 检查是否成功读取帧if not ret:break# 将图像从一种颜色空间转换为另一种颜色空间。frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 显示当前帧cv2.imshow('Video', frame)# 检查用户是否按下 'esc' 键,如果是则退出循环if cv2.waitKey(100) == 27:break
# 释放资源
video_capture.release()
cv2.destroyAllWindows()

5、区域切割

ROI:区域感兴趣(Region of Interest)的缩写。它指的是图像或视频中感兴趣的特定区域,需要进行分析或处理。
ROI可以由用户手动选择,也可以使用计算机视觉算法自动检测。

a = cv2.imread(r'./timg98.jpg')
b = a[100:300,100:300]  #直接对numpy数组进行切片
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(100000)
cv2.destroyAllWindows()

6、提取RGB颜色通道 

import cv2
# 1. 读取图像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道
# g 包含绿色通道
# r 包含红色通道
cv2.imshow('result', a2)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)
# 5. 关闭所有窗口
cv2.destroyAllWindows()

注意:我们这里是显示蓝色通道的图像,但是所显示的图片确实灰色的,那是因为只显示蓝色通道时,
实际上是将蓝色通道作为亮度值,而将绿色和红色通道设置为默认的最大值,也就是255。这会导致图像呈现为灰色。
想要展示只包含蓝色通道信息的彩色图像,可以将图像中的绿色通道和红色通道设为0,即移除绿色和红色,只保留蓝色。

7、图片的复制.copy()

import cv2
a = cv2.imread(r'./timg98.jpg')
# 复制原始图像以避免更改原始图像
a_new = a.copy()
a_new[:, :, 1] = 0  # 绿色通道设为0
a_new[:, :, 2] = 0  # 红色通道设为0
# 创建一个窗口来显示修改后的图像,并将其命名为'result'
cv2.imshow('result', a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()

 8、合并颜色通道

import cv2
# 1. 读取图像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道  g 包含绿色通道  r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) 或者使用这行代码
cv2.imshow('result', img)
cv2.waitKey(100000)
cv2.destroyAllWindows()

9、图片修改

1、图片打码 

# 图片打码
import numpy as npa = cv2.imread(r'./timg98.jpg')
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

 2、图片组合

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b[200:350,200:350] = a[50:200,100:250]#注意:矩阵的大小必须要统一。
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(100000)
cv2.destroyAllWindows()

3、图片的放缩

cv2.resize
# 用于调整图像的大小。它有以下几个参数:
# src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
# dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像。
# fx:沿x轴的缩放系数。
# fy:沿y轴的缩放系数。

a = cv2.imread('timg98.jpg')#方法一
a_new = cv2.resize(a,(200,600))   # 宽、高#方法二
# a_new = cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
# print(a.shape)  # 高、宽、通道数cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()

10、图像的运算

1、图像的加法一


当某位置像素相加得到的数值小于255时,该位置数值为两图像的像素值相加之和,
当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去256,例如相加之后时260,则世纪时260-256=4。

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
c = a+10    #图片,
cv2.imshow('yuan',a)
cv2.imshow('a+10',c)
cv2.waitKey(100000)c = a[50:450,50:400]+b[50:450,50:400]
cv2.imshow('a+b',c)
cv2.waitKey(100000)

2、图像的加法二


​​​​​​​对于cv2的add()运算,当对图像a,图像b进行加法求和时,遵循以下规律
当某位置像素相加得到的数值小于255时,该位置数值为两图像的像素值相加之和
当某位置像素相加得到的数值大于255时,该位置数值为255

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
c = cv2.add(a,b)   #也可以使用使用
cv2.imshow('a add b',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()

3、图像的加权运算

就是计算在两幅图像的像素值之和时,将每幅图像的权值考虑进来,可以用公式表示为dst=src1×α+src×β+γ

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
#
c =cv2.addWeighted(a,0.2,b,0.8,0)   # 10:图像的亮度值(常数),将添加到加权和上
cv2.imshow('addWeighted',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()

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

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

相关文章

k8s中PAUSE容器与init容器比较 local卷与hostpath卷比较

目录 一、PAUSE容器与INIT容器比较 1. Pause 容器 作用 特点 示例 2. Init 容器 作用 特点 示例 3. Pause 容器 vs Init 容器 4. 总结 这两个哪个先启动呢? 详细启动顺序 为什么 Pause 容器最先启动? 示例 总结 二、local卷与hostpath卷…

Vue3 + TS组件封装指南

在 Vue 3 TypeScript 中封装组件时,需要注意以下几点: 1. Props 定义 使用 defineProps 或 PropType 定义组件的 props,并为其添加类型。 示例: import { defineComponent, PropType } from vue;export default defineComponen…

mybatis_plus的乐观锁

乐观锁:总是假设最好的情况,每次读取数据时认为数据不会被修改(即不加锁),当进行更新操作时,会判断这条数据是否被修改,未被修改,则进行更新操作。若被修改,则数据更新失…

Redis系列:深入理解缓存穿透、缓存击穿、缓存雪崩及其解决方案

在使用Redis作为缓存系统时,我们经常会遇到“缓存穿透”、“缓存击穿”和“缓存雪崩”等问题,这些问题一旦出现,会严重影响应用性能甚至造成服务不可用。因此,理解这些问题的产生原因和解决方案非常重要。 本文将全面讲解缓存穿透…

AT指令集-NBIOT

是什么? 窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…

CBNet:一种用于目标检测的复合骨干网架构之论文阅读

摘要 现代顶级性能的目标检测器在很大程度上依赖于骨干网络,而骨干网络的进步通过探索更高效的网络结构带来了持续的性能提升。本文提出了一种新颖且灵活的骨干框架——CBNet,该框架利用现有的开源预训练骨干网络,在预训练-微调范式下构建高…

c++中字符串string常用的函数

在C中&#xff0c; std::string 类有许多常用函数&#xff0c;以下是一些常见的&#xff1a; 1. length() 或 size() &#xff1a;返回字符串的长度&#xff08;字符个数&#xff09;&#xff0c;二者功能相同。例如&#xff1a; #include <iostream> #include <str…

《保险科技》

自己在保险行业工作很多年&#xff0c;只是接触了一些数据的内容&#xff0c;对于保险业务的知识了解的很少&#xff0c;想通过这本书补充一下&#xff0c;但是发现这本书就是一些知识的拼接。 先将保险的历史&#xff0c;后讲保险的定义&#xff0c;然后就是吹嘘保险行业和互联…

蓝桥杯第13届真题2

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut&#xff0c;锁存器PD2也是&#xff0c;然后都设置为起始高电平&#xff0c;生成代码时还要去解决引脚冲突问题 二.按键 按键配置&#xff0c;由原理图按键所对引脚要GPIO_Input 生成代码&a…

java之IP 工具类

java程序一直需要获取物理机的ip&#xff0c;写了一个ip的工具类&#xff0c;感觉日常所需够了 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException;/*** IP 工具类*/ public class IpUtil {public static St…

贪心算法作业参考:P1106,P4995,P5019

贪心算法作业参考&#xff1a;P1106&#xff0c;P4995&#xff0c;P5019 P1106 删数问题 作业批注&#xff1a; 原作业提交&#xff0c;是删除k个最大的数。 不一定是删除最大的数。 参考如下&#xff0c;用例&#xff1a; 输入&#xff1a; 50074897 2输出&#xff1a; 4…

双曲空间学习记录

文章目录 前期学习内容双曲空间中的图卷积神经网络 前期学习内容 双曲空间中的图卷积神经网络 250318&#xff1a;这个博客的产生原因是我去看了B站上的一个视频&#xff0c;up说ppt上传到github上了&#xff0c;但是我去找了一圈也没有找到&#xff0c;然后想给他留言&#x…

【ES6新特性】默认参数常见用法

ES6新特性之默认参数的多种用法 &#x1f680;默认参数基础用法 在ES6中&#xff0c;我们可以直接在函数参数列表中为参数设置默认值&#xff1a; // ES5的实现方式 function greet(name) {name name || Guest;console.log(Hello, ${name}!); }// ES6默认参数写法 function…

LORA的AB矩阵是针对Transformer的多头还是MLP

LORA的AB矩阵是针对Transformer的多头还是MLP Transformer中的矩阵是一个整体还是分开的每个小矩阵 在LORA(Low-Rank Adaptation)中,AB矩阵的应用位置和Transformer中的矩阵拆分方式如下: 1. LORA的AB矩阵作用对象 LORA的AB矩阵主要作用于Transformer的多头注意力模块和…

【大模型基础_毛玉仁】2.4 基于 Encoder-Decoder 架构的大语言模型

更多内容&#xff1a;XiaoJ的知识星球 目录 2.4 基于 Encoder-Decoder 架构的大语言模型2.4.1 Encoder-Decoder 架构2.4.2 T5 语言模型1&#xff09;T5 模型结构2&#xff09;T5 预训练方式3&#xff09;T5 下游任务 2.4.3 BART 语言模型1&#xff09;BART 模型结构2&#xff0…

browser-use WebUI + DeepSeek 基于AI的UI自动化解决方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技术栈为&#xff1a; 二、browser-use webui 主要功能使用场景 三、使用教程1.python 安装2、把项目clone下来3、安装依赖4、配置环境5、启动6、配置1.配置 Agent2.配置要用的大模型3.关于浏览器的一些设置 四、Deep…

WPF CommunityToolkit.MVVM库的简单使用

CommunityToolkit.MVVM 是 .NET 社区工具包中的一部分&#xff0c;它为实现 MVVM&#xff08;Model-View-ViewModel&#xff09;模式提供了一系列实用的特性和工具&#xff0c;能帮助开发者更高效地构建 WPF、UWP、MAUI 等应用程序。以下是关于它的详细使用介绍&#xff1a; 1…

Windows安装Apache Maven 3.9.9

第一步下载资源 官网&#xff1a;下载 Apache Maven – Maven 环境变量配置 M2_HOME 指向bin目录 MAVEN_HOME 指向根目录 M2_HOME 不确定是否必须要 Path配置 &#xff0c;需要注意MAVEN顺序应当在java之前 验证是否安装成功&#xff0c;在cmd中以管理员方式打开&#xff0c…

【spring-boot-starter-data-neo4j】创建结点和查找结点操作

配置连接neo4j # application.properties spring.neo4j.uribolt://localhost:7687 spring.neo4j.authentication.usernameneo4j spring.neo4j.authentication.password你的密码定义实体类 package com.anmory.platform.GraphService.Dao;import org.springframework.data.neo…

pytorch小记(十三):pytorch中`nn.ModuleList` 详解

pytorch小记&#xff08;十三&#xff09;&#xff1a;pytorch中nn.ModuleList 详解 PyTorch 中的 nn.ModuleList 详解1. 什么是 nn.ModuleList&#xff1f;2. 为什么不直接使用普通的 Python 列表&#xff1f;3. nn.ModuleList 的基本用法示例&#xff1a;构建一个包含两层全连…