计算机视觉中图像的基础认知
一、图像/视频的基本属性
在计算机视觉中,图像和视频的本质是多维数值矩阵。图像或视频数据的一些基本属性。
- 宽度(W) 和 高度(H) 定义了图像的像素分辨率,单位通常是像素。例如,一张 1920x1080 的图像有 1920 列(宽度)和 1080 行(高度)。
- 通道(C) 表示图像的颜色空间,常见的有RGB(红、绿、蓝)三通道彩色图像和单通道灰度图像。
在深度学习框架中,通常使用四维数组 [batch_size, channel, height, width] 或简称 [N, C, H, W] 来表示一批图像的数据格式。而对于视频数据,我们则需要额外增加一个时间维度,即 [batch_size, channel, height, width, time_step],将视频拆解为单帧图像后,复用图像处理逻辑。
RGB三通道彩色图像和单通道灰度图像是数字图像处理中的两种基本类型,它们在色彩表示、数据存储以及应用场景等方面有着显著的区别。理解这两者的差异有助于更好地进行图像处理与分析。
二、理解彩色与灰度图像
2.1 RGB三通道彩色图像
-
定义:RGB图像由红(Red)、绿(Green)、蓝(Blue)三个颜色通道组成。每个像素的颜色通过这三个通道的不同强度组合来表示。每个通道通常是一个8位的整数,取值范围为0到255。
-
色彩表示:
- 每个像素点由三个数值(R, G, B)组成,分别对应红色、绿色和蓝色的强度。
- 这种模式允许表示超过1600万种不同的颜色((256^3)),从而可以精确地再现自然界的大多数颜色。
-
应用场景:适用于需要高保真度色彩再现的应用场景,如照片编辑、影视制作、游戏开发等。
2.2 单通道灰度图像
-
定义:灰度图像仅包含一个通道,用来表示亮度信息。每个像素的值代表该点的亮度级别,范围通常是0(黑色)到255(白色),中间值则表示不同深浅的灰色。
-
色彩表示:
- 因为只有一个通道,所以每个像素只需要一个数值来表示其亮度。
- 尽管只能显示从黑到白的不同灰度级,但这种简化有时对于特定任务来说已经足够,并且能减少计算复杂度和存储需求。
-
应用场景:常用于文本识别、边缘检测、医学影像分析等领域,在这些领域中,颜色信息并非关键因素,而对比度和亮度的变化更为重要。
2.3 区别总结
-
信息量:
- RGB图像包含了更多的信息(每个像素3个值),能够表达丰富的色彩。
- 灰度图像每个像素只有1个值,信息量较少,但足以描述图像的亮度分布。
-
存储空间:
- RGB图像占用的空间大约是灰度图像的三倍,因为需要存储三个通道的数据。
-
处理速度:
- 处理灰度图像通常比处理RGB图像更快,因为它涉及的数据量较小。
-
用途:
- RGB图像适合于那些依赖色彩区分的任务,比如物体识别、场景分类等。
- 灰度图像更适合于那些基于形状或纹理特征的任务,例如文档扫描、X光片分析等。
-
转换关系:
- 可以通过一定的算法将RGB图像转换为灰度图像,常用的方法之一是加权平均法,即根据人眼对不同颜色敏感度的不同,给RGB分量赋予不同的权重来计算灰度值。例如,常用的公式为:
Gray = 0.299*R + 0.587*G + 0.114*B。
- 可以通过一定的算法将RGB图像转换为灰度图像,常用的方法之一是加权平均法,即根据人眼对不同颜色敏感度的不同,给RGB分量赋予不同的权重来计算灰度值。例如,常用的公式为:
三、图像的读取框架
Python 生态中有三大主流图像处理库,各有适用场景:
3.1 Matplotlib
Matplotlib 是一个强大的数据可视化工具,它模仿了 Matlab 的绘图功能。虽然它没有内置的图像处理功能(如旋转、滤波),需手动实现。但可以方便地与 科学计算库NumPy 结合使用来进行图像操作。
from matplotlib import pyplot as plt
import numpy as np
# 读取为 [H, W, C] 的 NumPy 数组(RGB)
img = plt.imread("哪吒.jpeg")
H, W, C = img.shape
print(img.shape) # 输出(2160, 3840, 3)
# 显示图像
plt.imshow(img)
# 保存图像
plt.imsave("哪吒output.jpeg", img)

# 提取红色通道并显示为灰度图
img_r = img[:, :, 0]
plt.imshow(img_r, cmap="gray")

# 下采样(每4像素取1个)
plt.imshow(img[::4, ::4, :])
从尺度上看,图像的像素点少了 4 分之 1

# 截取左上角 1/4 图像
plt.imshow(img[:H//2, :W//2, :])

3.2 OpenCV
OpenCV 是计算机视觉领域的金标准库,功能全面,覆盖图像处理、视频分析、实时摄像头捕获,底层为 C++ 实现,Python 通过 cv2 模块调用,支持特征检测、目标跟踪、AR 等高级功能。
通过 pip install opencv-python 即可安装。
import cv2# 读取图像
# 读取为 [H, W, C] 的 BGR 格式数组
img = cv2.imread(filename="哪吒.jpeg")
print(img.shape) # 注意OpenCV默认读取为BGR格式
# 显示图像
cv2.imshow(winname = "Window", mat=img)
# 等待按键
cv2.waitKey(delay=0)
# 关闭窗口
cv2.destroyAllWindows()
使用 OpenCV 库从摄像头捕获视频流并在窗口中实时显示每一帧,直到用户按下 ESC 键退出
# 视频读取示例
# 创建一个 VideoCapture 对象,参数 0 表示使用第一个可用的摄像头(笔记本内置摄像头或连接的第一个外置摄像头)。如果你有多个摄像头,可以通过改变这个数字来选择不同的设备(如第二个摄像头可以使用 1)。
cap = cv2.VideoCapture(0)
# 开始一个无限循环,用于持续读取和处理视频帧,直到满足特定条件退出循环。
while True:# 读取帧# cap.read(): 从摄像头读取下一帧。此方法返回两个值:# status: 布尔值,表示是否成功读取了帧。如果为 True,则表示成功读取;如果为 False,则表示读取失败。# frame: 当前捕获的帧,通常是一个 NumPy 数组,包含图像数据。status, frame = cap.read()if not status: break# 显示帧# 在名为 "demo" 的窗口中显示当前帧 frame# 每次调用此函数都会更新窗口中的图像。cv2.imshow(winname="demo", mat=frame)# 按 ESC 退出# 等待按键事件。参数 delay 指定了等待的时间(以毫秒为单位)。# 这里设置为 1000 // 24,即大约每秒24帧的速度(模拟电影的帧率),这意味着每帧之间会有短暂的延迟。# 如果检测到按下了 ESC 键(ASCII码为27),则跳出循环并结束程序。if cv2.waitKey(delay=1000 // 24) == 27: break
# 释放摄像头资源,确保摄像头不再被占用,以便其他应用程序可以访问它。
cap.release()
# 关闭所有由 OpenCV 创建的窗口,释放相关资源。
cv2.destroyAllWindows()
3.3 PIL
PIL (Python Imaging Library) 轻量级图像处理, 是专门用于图像处理的 Python 库,Python 内置库,适合简单编辑与格式转换。易于使用且能无缝衔接 PyTorch。
from PIL import Imageimg = Image.open("哪吒.jpeg") # 读取为 PIL.Image 对象
print(img.size, img.width) # 输出 (3840, 2160) 3840
img.resize((100, 100)) # 调整尺寸
img.rotate(-20) # 旋转
img.convert("L") # 转灰度图
np.array(img).shape
img.save(fp="哪吒2.jpeg") # 保存
相关文章:
计算机视觉中图像的基础认知
一、图像/视频的基本属性 在计算机视觉中,图像和视频的本质是多维数值矩阵。图像或视频数据的一些基本属性。 宽度(W) 和 高度(H) 定义了图像的像素分辨率,单位通常是像素。例如,一张 1920x10…...
MYSQL的管理备份
一、系统数据库 mysql数据库安装完成后,自带了四个数据库,具体作用如下: mysql:存储MySQL服务器正常运行所需的各种信息(时区、主从、用户、权限等); information_schema:提供了访问数据库元数据的各种表和视图,包含数据库、表、字段类型及访问权限等; performanc…...
数据仓库与数据挖掘记录 三
数据仓库的数据存储和处理 数据的ETL过程 数据 ETL 是用来实现异构数据源的数据集成,即完成数据的抓取/抽取、清洗、转换 .加载与索引等数据调和工作,如图 2. 2 所示。 1)数据提取(Extract) 从多个数据源中获取原始数据(如数据…...
第12周:LSTM(火灾温度)
1.库以及数据的导入 1.1库的导入 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn1.2数据集的导入 data pd.read_csv("woodpine2.csv")dataTimeTem1CO 1Soot 100.00025.00.0000000.00000010.22825.…...
MySQL的SQL执行流程
项目查询数据库的流程 用户通过Tomcat服务器发送请求到MySQL数据库的过程。 用户发起请求:用户通过浏览器或其他客户端向Tomcat服务器发送HTTP请求。 Tomcat服务器处理请求: Tomcat服务器接收用户的请求,并创建一个线程来处理这个请求。 线…...
Foundation CSS 可见性
Foundation CSS 可见性 引言 在网页设计中,CSS可见性是一个至关重要的概念。它决定了元素在网页上是否可见,以及如何显示。Foundation CSS 是一个流行的前端框架,它提供了丰富的工具和组件来帮助开发者构建响应式和可访问的网页。本文将深入探讨 Foundation CSS 中的可见性…...
7. Docker 容器数据卷的使用(超详细的讲解说明)
7. Docker 容器数据卷的使用(超详细的讲解说明) 文章目录 7. Docker 容器数据卷的使用(超详细的讲解说明)1. Docker容器数据卷概述2. Docker 容器数据卷的使用演示:2.1 宿主 和 容器之间映射添加容器卷2.2 容器数据卷 读写规则映射添加说明2.3 容器数据卷的继承和共…...
算法——结合实例了解广度优先搜索(BFS)搜索
一、广度优先搜索初印象 想象一下,你身处一座陌生的城市,想要从当前位置前往某个景点,你打开手机上的地图导航软件,输入目的地后,导航软件会迅速规划出一条最短路线。这背后,就可能运用到了广度优先搜索&am…...
qt QCommandLineOption 详解
1、概述 QCommandLineOption类是Qt框架中用于解析命令行参数的类。它提供了一种方便的方式来定义和解析命令行选项,并且可以与QCommandLineParser类一起使用,以便在应用程序中轻松处理命令行参数。通过QCommandLineOption类,开发者可以更便捷…...
Linux权限提升-内核溢出
一:Web到Linux-内核溢出Dcow 复现环境:https://www.vulnhub.com/entry/lampiao-1,249/ 1.信息收集:探测⽬标ip及开发端⼝ 2.Web漏洞利⽤: 查找drupal相关漏洞 search drupal # 进⾏漏洞利⽤ use exploit/unix/webapp/drupal_dr…...
【环境安装】重装Docker-26.0.2版本
【机器背景说明】Linux-Centos7;已有低版本的Docker 【目标环境说明】 卸载已有Docker,用docker-26.0.2.tgz安装包安装 1.Docker包下载 下载地址:Index of linux/static/stable/x86_64/ 2.卸载已有的Docker 卸载之前首先停掉服务 sudo…...
【云安全】云原生- K8S API Server 未授权访问
API Server 是 Kubernetes 集群的核心管理接口,所有资源请求和操作都通过 kube-apiserver 提供的 API 进行处理。默认情况下,API Server 会监听两个端口:8080 和 6443。如果配置不当,可能会导致未授权访问的安全风险。 8080 端口…...
笔记7——条件判断
条件判断 主要通过 if、elif 和 else 语句来实现 语法结构 # if 条件1: # 条件1为真时执行的代码 # elif 条件2: # 条件1为假、且条件2为真时执行的代码 # elif 条件3: # 条件1、2为假、且条件3为真时执行的代码 # ... # else: # 所…...
Word 公式转 CSDN 插件 发布
经过几个月的苦修,这款插件终于面世了。 从Word复制公式到CSDN粘贴,总是出现公式中的文字被单独提出来,而公式作为一个图片被粘贴的情况。公式多了的时候还会导致CSDN禁止进一步的上传公式。 经过对CSDN公式的研究,发现在粘贴公…...
二次封装axios解决异步通信痛点
为了方便扩展,和增加配置的灵活性,这里将通过封装一个类来实现axios的二次封装,要实现的功能包括: 为请求传入自定义的配置,控制单次请求的不同行为在响应拦截器中对业务逻辑进行处理,根据业务约定的成功数据结构,返回业务数据对响应错误进行处理,配置显示对话框或消息形…...
算法——结合实例了解深度优先搜索(DFS)
一,深度优先搜索(DFS)详解 DFS是什么? 深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树、图的算法。其核心思想是尽可能深地探索分支,直到无法继续时回溯到上一个节点…...
数据结构(考研)
线性表 顺序表 顺序表的静态分配 //线性表的元素类型为 ElemType//顺序表的静态分配 #define MaxSize10 typedef int ElemType; typedef struct{ElemType data[MaxSize];int length; }SqList;顺序表的动态分配 //顺序表的动态分配 #define InitSize 10 typedef struct{El…...
使用SSE协议进行服务端向客户端主动发送消息
1.创建一个SSE配置类: 1.1代码如下:package com.campus.platform.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.AsyncS…...
FastAPI 高并发与性能优化
FastAPI 高并发与性能优化 目录 🚀 高并发应用设计原则🧑💻 异步 I/O 优化 Web 服务响应速度⏳ 在 FastAPI 中优化异步任务执行顺序🔒 高并发中的共享资源与线程安全问题 1. 🚀 高并发应用设计原则 在构建高并发应…...
DFS+回溯+剪枝(深度优先搜索)——搜索算法
目录 一、递归 1.什么是递归? 2.什么时候使用递归? 3.如何理解递归? 4.如何写好递归? 二、记忆化搜索(记忆递归) 三、回溯 四、剪枝 五、综合试题 1.N皇后 2.解数独 DFS也就是深度优先搜索&am…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
