OpenCV图像认知(一)
OpenCV:
是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法
OpenCV-Python:
OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。
Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可读性。它使程序员能够用更少的代码行表达思想,而不会降低可读性。
与C / C++等语言相比,Python速度较慢。Pytho n可以使用C / C++扩展,这使我们可以在C / C++中编写计算密集型代码,并创建可用作Python模块的Python包装器。这给我们带来了两个好处:首先,代码与原始C / C++代码一样快(因为它是在后台工作的实际C++代码),其次,在Python中编写代码比使用C / C++更容易。OpenCV-Python是原始OpenCV C++实现的Python包装器。
OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有OpenCV数组结构都转换为Numpy数组。这也使得与使用Numpy的其他库(如SciPy和Matplotlib)集成更容易。
安装opencv-python:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
opencv基础的图像操作:
读取图像:
语法:
import cv2
img = cv2.imread(path,方式)
path:读取图片的路径
方式:默认为彩色图像,也可选择灰度图等等
显示图像:
语法:
import cv2
cv2.imshow(arg1,arg2)
cv2.waitkey(0) #图像显示后等待键入后关闭窗口,0无限等待
arg1:显示图像的窗口的名称,格式为字符串
arg2:要显示的图片
注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来
保存图像:
语法:
import cv2
cv2.imwrite(arg1,arg2)
arg1:保存的路径及名称,格式为字符串
arg2:要保存的图片
示例:
import cv2img = cv2.imread('test.jpg')
cv2.imshow('test',img)
cv2.imwrite('test1.jpg',img)
cv2.waitkey(0)
绘制图形:
绘制直线:
语法:
cv2.line(img,start,end,color,thickness)
img:要绘制直线的图片
start:直线的起点
end:直线的终点
color:线条的颜色
thickness:线条的粗细
示例:
import cv2img = cv2.imread('test.jpg')
cv2.line(img, (100, 100), (200, 200), (255, 0, 0), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
绘制圆形:
语法:
cv.circle(img,centerpoint, r, color, thickness)
centerpoint:绘制圆形的圆心位置
r:绘制圆形的半径
绘制矩形:
语法:
cv.rectangle(img,leftupper,rightdown,color,thickness)
leftupper:要绘制矩形的左上角位置
rightdown:要绘制矩形的右下角位置
向图像中添加文字:
语法:
cv.putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)
text:要添加的文字
station:添加文字的位置
font:字体样式
Fontscale:字体大小
cv2.LINE_AA:
表示使用反走样(Anti-Aliasing)技术来绘制文本边框。反走样是一种提高图形质量的技术,它通过混合颜色和像素边缘以减少锯齿状效果,使文本看起来更加平滑、清晰。
示例:
import cv2img = cv2.imread('test.jpg')
cv2.putText(img, 'OpenCV', (100, 200), cv2.FONT_ITALIC, 1, (255, 255, 0), 4, cv2.LINE_AA)
cv2.imshow("img", img)
cv2.waitKey(0)
捕获摄像头的实时视频流:
语法:
import cv2cap = cv2.VideoCapture(path)
ret, frame = cap.read()
path:path视频流资源路径设置为0代表从默认摄像头捕获视频流
返回值cap 调用read()方法可以得到一个布尔值和一帧图像。布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败;如果为True,第二项则是当前帧的图像数据。
示例:
import cv2# 创建VideoCapture对象,参数为摄像头索引(通常为0,如果是单一摄像头)
cap = cv2.VideoCapture(0)
while True:# 读取一帧视频ret, frame = cap.read()# 检查读取是否成功if not ret:break# 在这里处理或显示帧(例如,显示原始帧)cv2.imshow('Camera Feed', frame)# 按'ESC'键退出循环if cv2.waitKey(1) & 0xFF == 27:break
# 释放摄像头资源并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
计算机中的图像:
像素:
像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成了完整的图像,例如,1920x1080分辨率的图像表示横向有1920个像素,纵向有1080个像素,总计约207万个像素。
日常生活中常见的图像是RGB三原色图。RGB图上的每个点都是由红(R)、绿(G)、蓝(B)三个颜色按照一定比例混合而成的,几乎所有颜色都可以通过这三种颜色按照不同比例调配而成。在计算机中,RGB三种颜色被称为RGB三通道,根据这三个通道存储的像素值,来对应不同的颜色。
图像:
在计算机中,图像是由像素组成的二维矩阵,每个像素包含颜色和亮度信息。图像可以是黑白的、灰度的或彩色的,具体取决于每个像素存储的信息类型。
二值图像:
二值图像是最简单的图像类型,每个像素只有两种可能的取值:0 或 1。通常,0 表示黑色,1 表示白色。
特点:
-
每个像素仅用 1位(1 bit)存储。
-
图像中只有黑白两种颜色,没有灰度过渡。
-
数据量非常小,处理速度快
灰度图像:
灰度图像的每个像素表示一个灰度级别,通常范围是 0 到 255。0 表示纯黑色,255 表示纯白色,中间值表示不同的灰度。
特点:
-
每个像素用 8位(1 字节)存储,可以表示 256 种灰度级别。
-
图像只有亮度信息,没有颜色信息。
-
数据量比彩色图像小,但仍能保留较多的细节。
彩色图像:
定义:
彩色图像的每个像素由 三个颜色通道 组成:红色(R)、绿色(G) 和 蓝色(B)。每个通道的取值范围是 0 到 255,通过这三个通道的组合可以表示丰富的颜色。
特点:
-
每个像素用 24位(3 字节)存储,可以表示约 1677 万种颜色(256 x 256 x 256)。
-
图像包含颜色和亮度信息,视觉效果更真实。
-
数据量较大,处理速度相对较慢。
三者的对比:
| 特性 | 二值图像 | 灰度图像 | 彩色图像 |
|---|---|---|---|
| 像素值范围 | 0 或 1 | 0 到 255 | 每个通道 0 到 255 |
| 存储空间 | 每个像素 1 位 | 每个像素 8 位(1 字节) | 每个像素 24 位(3 字节) |
| 颜色信息 | 黑白 | 灰度 | 彩色 |
| 数据量 | 最小 | 中等 | 最大 |
| 应用场景 | 文档扫描、图像分割 | 医学影像、黑白摄影 | 彩色摄影、视频处理 |
灰度实验:
灰度图与彩色图最大的不同就是:彩色图是由R、G、B三个通道组成,而灰度图只有一个通道,也称为单通道图像,所以彩色图转成灰度图的过程本质上就是将R、G、B三通道合并成一个通道的过程,而将彩色图像转换为灰度图像的过程称为灰度化。
最大值法:
原理:取每个像素的 R、G、B 三个通道中的最大值作为灰度值。
公式:
例如:某像素点R=66,G=188,B=72,则该像素点留下最大的值为188
特点:方法简单但是容易丢失细节
平均值法:
原理:将每个像素的 R、G、B 三个通道的值取平均,作为灰度值。
公式:
例如:某像素点R=91,G=121,B=46,则该像素点值为86
特点:简单易实现,但未考虑人眼对不同颜色的敏感度。
加权平均法(常用方法):
原理:根据人眼对颜色的敏感度,对 R、G、B 三个通道赋予不同的权重。通常绿色权重最高,红色次之,蓝色最低。
公式:
例如:某像素点R=91,G=121,B=46,则该点像素值为10*0.299+121*0.587+46*0.114=79。
特点:符合人眼视觉特性,效果较好,但计算量稍大。
二值化实验:
二值化(Binarization)是将图像转换为二值图像的过程。二值图像中,每个像素只有两种可能的取值:0(黑色)或 1(白色)。二值化通过设定一个阈值,将图像的像素值分为两类:高于阈值的像素设为白色(1),低于阈值的像素设为黑色(0)。
二值化的作用:
-
简化图像:
将复杂的灰度或彩色图像转换为只有黑白两种颜色的图像,便于后续处理。 -
分离目标与背景:
在图像分割中,二值化可以有效地将目标物体与背景分离。 -
减少数据量:
二值图像每个像素只用 1 位存储,数据量远小于灰度或彩色图像,适合存储和传输。 -
提高处理效率:
二值图像处理速度快,适合实时应用,如文本识别、二维码扫描等。
阈值法(THRESH_BINARY):
原理:对整个图像使用一个固定的阈值。大于这个阈值则白色,小于这个阈值则黑色
公式:
其中,I(x,y) 是像素点的灰度值,T 是阈值。
例如:如果阈值 T=127,则灰度值大于等于 127 的像素设为白色,小于 127 的像素设为黑色。
特点:简单、计算速度快,但是对光照不均匀的图像效果较差。
反阈值法(THRESH_BINARY_INV):
跟阈值法相反,大于这个阈值则黑色,小于这个阈值则白色
截断阈值法(THRESH_TRUNC):
原理:将高于阈值的像素值截断为阈值,低于阈值的像素值保持不变。这种方法通常用于保留图像的某些细节,同时限制像素值的范围。
公式:
其中:I(x,y) 是输入图像的像素值,T是设定的阈值
例如:设定的阈值为200,像素值127没超过阈值则还是127,像素值220超过阈值则修改为200
特点:低于阈值的像素值保持不变,因此图像的细节部分(如阴影、纹理)不会被丢失,高于阈值的像素值被截断为阈值,可以防止图像过亮。
低阈值零处理(THRESH_TOZERO):
原理:将低于阈值的像素值设为 0(黑色),而高于阈值的像素值保持不变。
公式:
其中:I(x,y) 是输入图像的像素值,T 是设定的阈值。
例如:设定的阈值为127,像素值100小于阈值则修改为0,像素值200大于阈值则还是200
特点:低于阈值的像素值被设为 0,可以有效去除图像中的噪声或背景,高于阈值的像素值保持不变,因此目标物体的细节和亮度信息得以保留。
超阈值零处理(THRESH_TOZERO_INV):
超阈值零处理和低阈值零处理类似,超过阈值的像素值修改为0,低于阈值的则不变
OTSU阈值法:
原理:自动计算最佳阈值,使得两类像素的类间方差最大。
计算图像的灰度直方图,遍历所有可能的阈值,计算类间方差,选择使类间方差最大的阈值。
特点:无需手动设置阈值,适合大多数图像,但计算量较大。
自适应阈值法:
原理:根据图像的局部区域动态计算阈值,适合光照不均匀的图像。
通过将图像分成多个小区域,对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布。
公式:
均值法:T(x,y)=mean(I(x,y))−C
高斯加权法:T(x,y)=GaussianWeightedMean(I(x,y))−C
特点:通过自适应阈值法,可以有效处理光照不均匀的图像,并生成高质量的二值化结果。
相关文章:
OpenCV图像认知(一)
OpenCV: 是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法 OpenCV-Python: OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。 Python是一种由Gui…...
自学微信小程序的第六天
DAY6 1、使用录音API首先需要通过wx.getRecorderManager()方法获取到一个RecorderManager实例,该实例是一个全局唯一的录音管理器,用于实现录音功能。 表32:RecorderManager实例的常用方法 方法名称 说明 start() 开始录音 pause() 暂停录音 resume() 继续录音 stop() 停止…...
C++动态与静态转换区别详解
文章目录 前言一、 类型检查的时机二、安全性三、适用场景四、代码示例对比总结 前言 在 C 中,dynamic_cast 和 static_cast 是两种不同的类型转换操作符,主要区别体现在类型检查的时机、安全性和适用场景上。以下是它们的核心区别: 一、 类…...
Qt6.8编译项目找不到文件——6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist.
问题:Error: dependent ‘…\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow’ does not exist. jom: D:\Temp\untitled1\build\Makefile [release] Error 2 20:20:43: 进程"D:\ProgramFiles\Develop\Qt6.8.2\Tools\QtCreator\bin\jom\jom.exe"…...
AI工具导航平台功能模块之混合分类器功能说明文档
AI工具导航平台功能模块之混合分类器功能说明文档 这是我最近正在开发的AI工具信息平台的部门功能模块混合分类器的说明文档,我的AI工具信息平台基于streamlit架构,整理出来与大家分享。 该程序的混合分类器采用规则引擎与深度学习模型协同工作的架构&…...
【时序预测】在线学习:算法选择(从线性模型到深度学习解析)
——如何为动态时序预测匹配最佳增量学习策略? 引言:在线学习的核心价值与挑战 在动态时序预测场景中(如实时交通预测、能源消耗监控),数据以流式(Streaming)形式持续生成,且潜在的…...
某个设备的RJ45网口接头为何不可连接任何POE设备
某个设备的RJ45网口接头不可连接任何POE设备 1.POE设备是什么? POE设备是指支持通过以太网线传输电力和数据的设备,即“Power over Ethernet”(PoE)技术的设备。这种技术允许网络设备在传输数据的同时,通过标准的RJ4…...
发展中的脑机接口:SSVEP特征提取技术
一、简介 脑机接口(BCI)是先进的系统,能够通过分析大脑信号与外部设备之间建立通信,帮助有障碍的人与环境互动。BCI通过分析大脑信号,提供了一种非侵入式、高效的方式,让人们与外部设备进行交流。BCI技术越…...
绕过密码卸载360终端安全管理系统
一不小心在电脑上安装了360终端安全管理系统,就会发现没有密码,就无法退出无法卸载360,很容易成为一个心病,360终端安全管理系统,没有密码,进程无法退出,软件无法卸载,前不久听同事说…...
Java数据结构第十五期:走进二叉树的奇妙世界(四)
专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、二叉树OJ练习题(续) 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…...
Transformer 代码剖析9 - 解码器模块Decoder (pytorch实现)
一、模块架构全景图 1.1 核心功能定位 Transformer解码器是序列生成任务的核心组件,负责根据编码器输出和已生成序列预测下一个目标符号。其独特的三级注意力机制架构使其在机器翻译、文本生成等任务中表现出色。下面是解码器在Transformer架构中的定位示意图&…...
JAVA八股—计算机网络(自用)
JAVA八股—计算机网络(自用) 2.7 1.介绍一下TCP/IP模型和OSI模型的区别 OSI模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,将计算机网络通信划分为七个不同的层级,每个层级都负责特定的功能。每个…...
unity和unity hub关系
unity和unity hub关系 Unity和Unity Hub是紧密相关但功能不同的两个软件,以下是它们的关系说明: Unity 定义:是一款专业的实时3D开发平台,广泛用于创建各种类型的3D和2D互动内容,如视频游戏、建筑可视化、汽车设计展示、虚拟现实(VR)和增强现实(AR)应用等。功能:提供…...
Linux的OOM机制
Linux 的 OOM(Out of Memory)机制是操作系统在内存耗尽时采取的一种保护措施。当系统内存不足,无法继续分配给进程时,Linux 内核会触发 OOM 杀手(OOM Killer),选择并终止某些进程,以…...
Typora的Github主题美化
[!note] Typora的Github主题进行一些自己喜欢的修改,主要包括:字体、代码块、表格样式 美化前: 美化后: 一、字体更换 之前便看上了「中文网字计划」的「朱雀仿宋」字体,于是一直想更换字体,奈何自己拖延症…...
Cursor配置MCP Server
一、什么是MCP MCP(Model Context Protocol)是由 Anthropic( Claude 的那个公司) 推出的开放标准协议,它为开发者提供了一个强大的工具,能够在数据源和 AI 驱动工具之间建立安全的双向连接。 举个好理解…...
定时器之输入捕获
输入捕获的作用 工作机制 输入捕获通过检测外部信号边沿(上升沿/下降沿)触发计数器(CNT)值锁存到捕获寄存器(CCRx),结合两次捕获值的差值计算信号时间参数。 脉冲宽度测量&#x…...
Uniapp开发微信小程序插件的一些心得
一、uniapp 开发微信小程序框架搭建 1. 通过 vue-cli 创建 uni-ap // nodejs使用18以上的版本 nvm use 18.14.1 // 安装vue-cli npm install -g vue/cli4 // 选择默认模版 vue create -p dcloudio/uni-preset-vue plugindemo // 运行 uniapp2wxpack-cli npx uniapp2wxpack --…...
0005__PyTorch 教程
PyTorch 教程 | 菜鸟教程 离线包:torch-1.13.1cpu-cp39-cp39-win_amd64.whl https://download.pytorch.org/whl/torch_stable.html...
Pikachu
一、网站搭建 同样的,先下载安装好phpstudy 然后启动Apache和Mysql 然后下载pikachu,解压到phpstudy文件夹下的www文件 然后用vscode打开pikachu中www文件夹下inc中的config.inc.php 将账户和密码改为和phpstudy中的一致(默认都是root&…...
CentOS7 使用 YUM 安装时报错:Cannot find a valid baseurl for repo: base/7/x86_64的解决方法
CentOS7 使用 YUM 安装时报错:Cannot find a valid baseurl for repo: base/7/x86_64的解决方法 报错代码解决方法 报错代码 输入命令yum update -y时报错Cannot find a valid baseurl for repo: base/7/x86_64 解决方法 有 wget 工具 更换YUM源 mv /etc/yum.…...
ChatGPT与DeepSeek:AI语言模型的巅峰对决
目录 引言 一、ChatGPT 与 DeepSeek 简介 (一)ChatGPT (二)DeepSeek 二、技术原理剖析 (一)ChatGPT 技术原理 (二)DeepSeek 技术原理 (三)技术原理对比…...
Linux----网络通信
一、IP地址详解 (一)核心概念 概念说明IP地址网络设备的唯一逻辑标识符,相当于网络世界的"门牌号"主机任何接入网络的终端设备(计算机/手机/服务器等)核心作用① 设备标识 ② 路由寻址 ③ 数据传输 &…...
Android逆向:一文掌握 Frida 详细使用
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Frida 简介2. Frida 的工作原理3. 安装 Frida3.1 安装 Frida 工具3.2 安装 Frida Server4. Frida 的基本使用4.1 连接到目标设备4.2 附加到目标进程4.3 编写 Frida 脚本5. Frida 的高级用法5.1 Hook Java 方法5.2 修…...
AI军备竞赛2025:GPT-4.5的“情商革命”、文心4.5的开源突围与Trae的代码革命
AI军备竞赛2025:GPT-4.5的“情商革命”、文心4.5的开源突围与Trae的代码革命 ——一场重塑人类认知边界的技术战争 一、OpenAI的“感性觉醒”:GPT-4.5的颠覆与争议 1.1 从“冷面学霸”到“温柔导师”:AI的情商跃迁 当用户输入“朋友放鸽子&…...
5G网络切片辨析(eMBB,mMTC,uRLLC)
URLLC有三大应用场景,分别是eMBB(增强型移动宽带)、uRLLC(高可靠低延时通信)和mMTC(海量机器通信)。 增强型移动宽带(eMBB):需要关注峰值速率,容…...
【MySQL篇】数据类型
目录 前言: 1,数据类型的分类 编辑 2 ,数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float类型 2.3.2 decimal类型 3,字符串类型 3.1 char 3.2 varchar 3.3 char与varchar的比较 3.4日期和时间类型 3.5 …...
DockerでOracle Database 23ai FreeをセットアップしMAX_STRING_SIZEを拡張する手順
DockerでOracle Database 23c FreeをセットアップしMAX_STRING_SIZEを拡張する手順 はじめに環境準備ディレクトリ作成Dockerコンテナ起動 データベース設定変更コンテナ内でSQL*Plus起動PDB操作と文字列サイズ拡張設定検証 管理者ユーザー作成注意事項まとめ はじめに Oracle…...
Skynet入门(一)
概念 skynet 是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。 设计初衷 如何充分利用它们并行运作数千个相互独立的业务。 模块设计建议 在 skynet 中,用服务 (service) 这…...
【音视频】图像基础概念
一、图像基础概念 1.1 像素 像素是一个图片的基本单位,pix使英语单词pixtureelement的结合“pixel”的简称,所以像素有图像元素之意。 例如2500*2000的照片就是指横向有2500个像素点,竖向有2000个像素点,总共500万个像素&#x…...
