AweiP Cache - 学习
type: channel
link: https://aweip.com/index.php/category/%E5%AD%A6%E4%B9%A0/
items: 对SSD知识的学习汇总
items: 计算机网络个人笔记
items: 《应用密码学与网络安全》知识总结
items: 《分布式计算》总结
items: 《计算机安全导论》考点复习
items: Python实现图像配准和拼接
items: Python实现Sobel及Canny边缘检测
items: LINUX学习笔记——Shell scripts

对SSD知识的学习汇总
type: item
date: 2025-08-10T22:46:42+08:00
description: 感谢HOMOLAB的精彩文章，让我对SSD有了更为科学的认识 PART I 固态硬盘（SSD）基础 1.1 发展历史与演进 NAND Flash 原理：1145141919810个浮栅晶体管平铺堆叠（发配到模电区）。把晶体管在不同挡位的电压（浮栅晶体管捕获存储的电子数量差异导致电压不同）当作信息。 比特数与存储密度 单元 数据量（二进制位数） SLC 1 MLC 2 TLC 3 QLC 4 性能与耐用性 从SLC➡MLC➡TLC➡QLC： 存储数据难度上升：主控在写入数据时，需要精确地控制浮栅中电子的数量； 读取数据的难度上升：主控在读取数据时，也必须非常精确地判断当前电压属于哪个区间，否则可能导致误读； 耐久性降低：存储信息越多，对电压精度要求越高。擦写次数越多，浮栅的磨损就越大，电压状态就越不稳定。 原因：如QLC，将16种不同的电压状态挤在一个小小的浮栅晶体管里，就好比在一条狭窄的公路上行驶16辆车。每辆车之间的安全距离会变得非常小。 1.2 SSD 的基本构成 NAND Flash 存储芯片：浮栅晶体管堆叠，有着比较玄学的寿命说 Block（擦除的最小单位） ➡ Page（读写最小单位）➡ Cell 主控（Controller）：硬盘里管理数据的大脑，在如今SSD产品损坏的案例里一般是由于主控物理暴毙或者固件暴毙导致的 DRAM 缓存（不是都有） 无缓（DRAMless SSD） 有缓（DRAM SSD）：存储FTL表，便于寻址 PART II SSD工作原理 2.1 读写与擦除 REW（Read-Erase-Write） 固态的擦除是以block为单位、读写以page为单位，nand的物理特性决定了他不能覆盖写入。因此如果我们要对一个已有数据的page进行写入，那么必须先要把这个page所在的block中的数据读出，block清空后再把所有数据写进去。 2.2 核心技术与机制 PART III SSD性能参数与协议 3.1 关键性能指标 IOPS（Input/Output Operations Per Second）：如英文名，硬盘每秒钟能够处理的输入/输出操作次数。 传统指标：随机和顺序是HDD时代传承下来的概念，在SSD中或许不再适用，但仍然被广泛使用。 顺序读写（Sequential Read/Write）： 顺序读写是指数据在存储介质上连续存储和读取的方式，通常用于大文件传输或连续数据流的处理。参数通过用大文件进行读写测试来获得。 随机读写（Random Read/Write）：随机读写是指数据在存储介质上分散存储和读取的方式，通常用于小文件或随机访问的数据。一般使用大量小文件进行读写测试。 相关论述文章《随机 稳态 缓外 无知以及谎言,不存在的随机写入》总结： SSD数据存储在NAND的多个页（Page）中，页是SSD的最小读写单位； SSD读取数据时，一般需要根据FTL（Flash Translation Layer）将逻辑地址转换为物理地址； FTL表的查询需要时间，如果一个文件分布在临近的物理空间上,那么对其进行读写的操作就不需要多次查询FTL表从而节省开销； FTL表的映射是非线性的，物理上连续的存储单元未必在逻辑上是连续的； 对于一个大块的连续文件写入而言,看起来是顺序写入，但数据不会集中在某一个NAND的某一个DIE的某一个plane的某一个block,而是分布在不同NAND上的不同block中； 因此，顺序读写和随机读写的概念对于SSD并不完全适用，SSD的性能更多地取决于其内部结构和数据管理方式；因此，顺序读写和随机读写的概念对于SSD并不完全适用，SSD的性能更多地取决于其内部结构和数据管理方式； 缓外速度（Sustained Write Speed）：在SLC Cache技术应用后产生的概念 定义：缓外速度是指在SSD的SLC Cache被填满后，数据写入到TLC或QLC NAND Flash时的速度。通常情况下，SLC Cache可以提供更高的写入速度，而缓外速度则较低。 备注：缓外速度不等同于SSD的实际写入速度，在如今常常导致用户对SSD性能的误解。实际上，连续大容量写入分多个阶段（关键词：SLC Cache释放、REW、Writeback惩罚、TLC/QLC直写、GC回收），而这受到厂家设计策略的影响，部分用户观察到的缓外速度没有太大的意义。 WAF（Write Amplification Factor） 定义：写放大因子，表示实际写入的数据量与原始数据量的比率。 产生原因：SSD是以页为单位进行读写，但由于NAND Flash的特性，无法直接覆盖写入，因此需要先擦除整个块（Block），然后再写入新的数据。这种操作会导致实际写入的数据量大于原始数据量，从而产生写放大现象。 WA…

计算机网络个人笔记
type: item
date: 2024-11-19T19:59:00+08:00
description: 第一章 计算机网络体系结构 I.计算机网络概述 概念 计算机网络是互连的、自治的计算机集合。 由节点（Node）和连接这些节点的链路（Link）组成。 组成 组成部分：硬件、软件、协议 工作方式： 边缘部分：用户直接使用的主机 核心部分：网络的基础设施，如路由器、交换机等 功能组成： 通信子网：负责数据传输 资源子网：负责资源管理 功能 数据通信 资源共享 分布式处理 提高可靠性 负载均衡 交换技术 种类 交换技术 特点 优点 缺点 电路交换 1.需要建立物理连接通道2.传输过程中通道被==独占== 1.通信时延2.适用于实时通信3.能够完全有序传输 1.建立连接时间长2.线路利用率低灵活性差3.难以实现差错控制 报文交换 1.报文封装全部信息2.==全部存储==后再转发3.无需建立连接 1.适用于短报文传输2.适用==不确定==通信量3.线路可靠4.动态分配线路 1.转发时延长2.缓存开销大3.难以实现差错控制 分组交换 1.报文分割成==固定长度==的分组2.==存储转发==3.无需建立连接 1.减少出错概率2.简化缓存3.流水线加速 1.存在存储转发时延2.需要额外信息量3.可能出现乱序、丢失、重复分组 [!Important] 报文转发和分组转发存在处理延迟，即上图中的空隙 分组转发花费时间和中间节点数量有关系，一些情况下可以简便运算 区别 计算机的数据传送往往是突发式的，采用电路交换时通信线路的利用率很低。报文交换和分组交换不需要建立连接（即预先分配通信资源），在传送计算机的突发数据时可以提高通信线路的利用率 将报文构造成若干个更小的分组进行分组交换，比将整个报文进行报文交换的时延要小，并且还可以避免太长的报文长时间占用链路，有利于差错控制，同时具有更好的灵活性。 分类 分布范围 广域网（WAN） 城域网（MAN） 局域网（LAN） 个人区域网（PAN） 传输技术 广播式网络 点对点网络 拓扑结构 总线型 星型 环型 网状型 关于差别，在通信效率、可靠性、扩展性、成本等方面出题 网络性能指标 [!Important] 速率中的K、M、G表示的是十进制，分别为10^3、10^6、10^9 速率 带宽 模拟信号：频率范围（Hz） 计算机网络：最高数据传输速率 吞吐量：单位时间通过网络的实际数据量 时延 发送时延 t_s = 数据块长度/发送速率 传播时延 t_c = 信道长度/传播速率 处理时延 排队时延 总时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延 时延带宽积: 传播时延 * 带宽 往返时延 RTT=|发送报文时间 - 接收确认ack时间| ！信道利用率 U 空闲时延 D_0、当前时延 D D = \frac{D_0}{1-U}，U 越大，当前时延 D 越大 II.计算机网络体系结构 分层结构 分层基本原则 每层实现特定功能 各层间由可以互相通信的接口 下层独立于上层，即没有上层也能工作 上层==单向==使用下层服务 结构元素 实体 实体：在通信过程中能够发送或接收信息的硬件或软件模块 对等实体：在通信过程中能够相互通信的实体 协议数据单元（PDU）：对等层水平传递的数据单元，分为数据和控制信息 服务数据单元（SDU）：对等层垂直传递的数据单元，服务上层 协议控制信息（PCI）：对等层水平传递的控制信息 [!Note] 第n层收到的PDUs称为n-1层的SDUs，加上第n层的PCI就构成了n层的PDUs ！协议、接口、服务 协议（水平关系） 协议 含义 作用 举例 语法 数据格式 数据的结构和编码 TCP 报文的格式由语法决定 语义 具体操作流程 何时发何种控制信息、如何应答 TCP 三次握手具体操作 同步（时序） 操作条件、时序 明确数据交互的顺序流程 TCP 连接的建立、关闭报文时序 接口 服务访问点 SAP（Service Access Point）：同一节点内相邻层之间的接口，提供服务访问点 服务（垂直关系） 服务原语：服务提供者和服务用户之间的通信操作 请求：服务用户向服务提供者发出的请求，请求服务提供者执行某种操作 指示：服务提供者向服务用户发出的指示，要求服务用户执行某种操作 响应：服务用户向服务提供者发出的响应，表示对指示的响应 证实：服务提供者向服务用户发出的证实，表示对请求的证实 服务分类 面向连接服务和无连接服务：是否建立连接 可靠服务和不可靠服务：是否保证数据传输的可靠性 有应答服务和无应答服务：是否需要对数据传输进行应答 OSI参考模型 低三层为通信子网，高三层为资源子网 层次 名称 传输单位 功能 协议 1 物理层 比特 1.规定物理接口参数2.规定信号意义和电气特征 IEEE802.3 2 数据链路层 帧 1.速率协调2.差错检测（==只能丢弃==）3.流量控制 SDLC…

《应用密码学与网络安全》知识总结
type: item
date: 2023-07-14T09:37:54+08:00
description: 第一讲 引言 网络安全核心地位的关键目标 保密性（Confidentiality） 数据保密性 隐私性 完整性（Integrity）(包括不可否认性、真实性) 数据完整性 系统完整性 可用性（Availability） 真实性（Authenticity） 可追溯性（Accountability） 安全攻击 被动攻击 在未经用户同意和认可的情况下将信息或数据文件泄露给系统攻击者，但对数据信息不做任何修改 常见手段 搭线监听 无线截获 其他截获 应对措施：重点在于预防 主动攻击 涉及某些数据流的篡改或虚假流的产生 分类 阻断攻击 伪造攻击 重放攻击 篡改攻击 拒绝服务攻击 应对措施 自动审计 入侵检测 完整性恢复 安全机制 安全机制要具备检测、防御或从安全攻击中恢复的能力，没有单一的机制能够提供所有的安全服务 特定的安全机制（specific security mechanisms） 加密， 数字签名， 访问控制，数据完整性，认证交换，流量填充，路由控制，公证等 普遍的安全机制（pervasive security mechanisms） 可信功能，安全标签，事件检测，安全审计跟踪，安全恢复 安全服务 可认证性 Authentication 访问控制 Access Control 机密性 Confidentiality 完整性 Integrity 不可否认性 Non-repudiation 可用性 Availability 第二讲 传统加密技术 密码学 密码编码学 研究内容：主要研究对信息进行编码，实现对信息的隐蔽 特征 密码编码学常用运算：代替与置换 所用的密钥数：单钥与双钥 处理明文的方法：分组密码与流密码 密码分析学 研究内容：主要研究如何破解密文的方法 攻击的两种常用方法 密码分析学： cryptanalytic attack 穷举攻击： brute-force attack 保护密码算法还是密钥 与维护算法的保密性相比，维护密钥的保密性更容易。 万一密钥暴露了，Alice 和 Bob 可以很容易地更换密钥；而万一算法被攻破，重新设计一个很好的加密算法要难得多。 万一有多对人员需要加密其通信，这些人可以使用相同的算法和不同的密钥，而使用不同的程序则太难。 加密算法 凯撒密码：共有密钥25个、移位、替换 单表代替密码：任意地打乱字母的顺序，密钥数目： 26！＞ 4 × 10^{26} playfair 密码：多字母代替密码，密钥空间：25！≈1.6×10^{25} Hill 密码 加密：C≡KP mod 26，其中，K为密钥矩阵，P、C分别为明、密文分组 解密：P≡K^{-1}C mod 26 维吉尼亚密码 置换密码 第三讲 分组密码与 DES Feistel 密码结构 混淆和扩散 混淆：使得密文的统计特性与密钥的取值之间的关系尽量复杂 扩散：明文的统计特征消散在密文中，使得明文和密文之间的统计关系尽量复杂 DES 加解密 两次置换（初始置换和初始逆置换） 密钥控制下的十六轮迭代加密 轮密钥生成 DES 是一种用 56 位密钥来加密 64 位数据的方法 雪崩效应 明文或者密钥的某一位发生变化，会导致密文很多位的变化 第四讲 代数基础 模运算性质 对称 传递 计算2^{64} mod 2012 \begin{flalign*} &2^2 =4 mod 2012\\ &2^4 =16 mod 2012\\ &2^8 =256 mod 2012\\ &2^{16}=65536 ≡1152 mod 2012\\ &2^{32}=1152^2 ≡1196 mod 2012\\ &2^{64}=1196^2 ≡1896 mod 2012& \end{flalign*} 欧几里得算法（辗转相除法） 求gcd(1970, 1066) \begin{flalign*} &令a=1970，b=1066\\ &1970=1×1066+904\\ &1066=1×904+162\\ &904=5×162+94 \\ &…… …… \\ &10=1×6+4\\ &6=1×4+2\\ &4=2×2\\ &因此gcd(1970, 1066)=2 & \end{flalign*} 求乘法逆元 已知28与81互素，求81 mod 28的逆元。 \begin{flalign*} &81=2×28+25\\ &28=1×25+3\\ &25=8×3+1\\ \\ &1=25-8×3\\ & =25-8×(28-25)\\ & =(-8)×28+9×(81-2×28)\\ & =9×81+(-26)×28\\ &所以81×9≡1 mod 28，同时 28×（－26）≡1 mod 81, 81 mod 28的逆元为9\\ &而28 mod 81的逆元为－26≡55&…

《分布式计算》总结
type: item
date: 2023-06-11T17:53:00+08:00
description: 一、 分布式计算概述 1. 分布式系统定义 分布式系统是由一组通过网络进行通信，为了完成共同的任务而协调工作的计算机节点组成的系统 1.1 消息传递模型（Shared-Nothing） 节点之间通过消息传递进行通信 内部运算速度快，但通信速度慢 1.2 分布式计算与并行计算 分布式计算是并行计算的一种特殊形式 并行计算 指令并行 CPU多核并行：多线程编程 多CPU并行（一致性内存共享）：多进程编程 多CPU并行（非一致性内存共享）：分布式计算 基于GPU的并行计算 多机并行计算 1.3 分布式与云计算 云计算 用户角度：是一种服务/应用/交付模式，方便用户随时随地通过网络访问应用程序、存储数据，不是一种技术 与分布式计算的关系 云计算是目标，分布式计算是手段 分布式计算是实现云计算的核心技术之一（还有虚拟化技术，网络通信技术，安全技术等） 2. 构建分布式系统的收益 提高计算能力 提高存储能力 提高网络吞吐能力 提高可靠性 提高可扩展性 提高安全性 实现资源共享 实现跨时空协同服务 3. 分布式系统衡量指标 业务层性能 时间复杂度 空间复杂度 通信复杂度 可扩展性：系统能够适应业务量的增长 容错性：系统在部分节点失效时，仍能正常工作 并发性：系统能同时处理多个请求 透明性：用户感知不到系统的分布式特性 开放性：节点可以动态加入或退出系统 安全性：系统能抵御各种攻击 可观测/可维护性：系统能够监控自身的运行状态，及时发现故障并修复 简记：扩容，容错，并发，透明，开放，安全，可观测 4. 设计分布式系统的挑战 与性能衡量指标 类似 5. 分布式计算任务的分类 5.1 OLTP（联机事务处理） 实时处理大量的短小的事务请求，每个事务请求的处理时间很短，通常是几毫秒到几秒钟 5.2 OLAP（联机分析处理） 对大量的历史数据进行分析，通常是对大量数据进行聚合计算，每个计算任务的处理时间很长，通常是几分钟到几小时 5.3 流式计算 对大量的实时数据进行分析，通常是对数据进行过滤、聚合、统计等操作，每个计算任务的处理时间很短，通常是几毫秒到几秒钟 6. 分布式系统架构模式 6.1 客户端-服务器模式 负载均衡技术 如何架构 通过DNS轮询 通过反向代理 通过负载均衡器 带来的收益 提高系统的可扩展性，弹性增减节点 提高系统的可靠性 提高系统的性能 常用的负载均衡算法及优劣 轮询：简单，均衡，但不考虑节点的负载情况 随机：简单，均衡，但不考虑节点的负载情况 最少连接：考虑节点的负载情况，但不考虑节点的性能 最少响应时间：考虑节点的负载情况，考虑节点的性能，但不考虑节点的可用性 哈希：考虑节点的负载情况，考虑节点的性能，考虑节点的可用性，但不支持动态增减节点 一致性哈希：考虑节点的负载情况，考虑节点的性能，考虑节点的可用性，支持动态增减节点 6.2 主从模式 主从模式的概念 主节点 负责处理客户端的请求，维护系统的状态 从节点 负责处理主节点分配的任务，不维护系统的状态 主从模式的优缺点 优点 提高系统的可扩展性 提高系统的可靠性 提高系统的性能 缺点 主节点成为瓶颈 从节点的状态不一致 6.3 总线模式 总线模式的概念 不同节点通过总线进行通信 消息发送与接受者解耦 异步 分工 6.4 对等模式 对等模式的概念 系统中的所有计算节点任务分工都是对等的 完全相同的软件在不同的节点上运行，只是初始化参数不同 对等模式的优缺点 优点 不会出现单点故障 无需维护系统的状态 缺点 效率低 7. 分布式中间件的概念 7.1 中间件在计算机系统中的位置 中间件是介于操作系统和应用程序之间的软件，它为应用程序提供服务，为操作系统提供接口 7.2 中间件的作用 为开发者提供高层的抽象接口 提高互操作性和可移植性 提供分布式系统的基础设施 7.3 中间件的基本表现形式 独立的后台进程 语言编译/解释器的一部分 函数库 二、分布式系统节点通信技术 1. 基于Socket的通信技术 1.1 Socket的概念 Socket是一种通信机制，它允许不同节点上的应用程序通过网络进行通信 是传输层和网络层提供给应用层的接口 1.2 基于流式Socket（TCP） 建立连接（三次握手） 客户端向服务器发送连接请求 服务器向客户端发送连接确认 客户端向服务器发送连接确认 发送请求 客户端向服务器发送请求 返回响应 服务器向客户端发送响应 关闭连接 1.3 基于数据报Socket（UDP） 发送请求 客户端向服务器发送请求 返回响应 服务器向客户端发送响应 与TCP的区别：没有建立连接的过程，不可靠，不保证数据的顺序 1.4 并发服务技术 多线程——线程池 优点：线程复用，减少线程创建和销毁的开销 多路复用（事件驱动技术） 优点：单线程，减少线程切换的开销，适用于并发连接数少…

《计算机安全导论》考点复习
type: item
date: 2023-03-02T14:52:00+08:00
description: 一、概述 1.【重点】基本概念 CIA(机密性、完整性和可用性) 机密性 Confidentiality：避免信息的非授权泄露 加密(Encryption) 访问控制(Access control) 认证(Authentication) 授权(Authorization) 物理安全(Physical security) 完整性 Integrity：确保信息不被非授权修改的属性 备份(Backup)：定期归档 数据校验和(Checksum)：计算一个函数将文件内容映射为一个数值。 数据纠错码(data correcting codes)：检测并纠正数据 保护元数据(metadata)：描述数据的数据。 可用性 Availability：确保授权用户能够对信息进行及时访问和修改的属性（目标用户能使用权限） 物理保护：在物理环境恶劣变化时也能够保护信息的可用性。。 计算冗余：在部分计算机或者存储设备失效的情况下依然可以提供信息。例如采用磁盘冗余阵列(RAID)和多台计算机。 3A(保证，真实性，匿名性) Assurance 保证：指计算机系统中信任 （个人理解为权限及其分配问题）如何被提供和管理 系统资源的管理和保护：确保系统资源如何在设定策略下使用 信息使用方式的管理：确保信息如何在设定策略下使用 信任管理： 策略(policy)： 指人或者系统对他们或者其他个体的行为预期 权限(permission)： 指在与人和系统交互时所允许的行为 保护(protection)： 指为了实施权限和策略所提供的机制 例子：在线音乐系统(为用户如何访问歌曲设定策略；为购买特定歌曲的用户提供访问权限；为系统提供保护以防止用户未授权的访问) Authenticity 真实性：确定人或者系统所发布的声明、策略和权限真实性的能力 真实性的满足能够确保在线交易的可行性。 不可抵赖性(Nonrepudiation)：一个人或者系统不能否认其所发布的真实声明 主要工具： 数字签名(digital signatures)： 一种加密计算方法，允许人或者系统以唯一的方式认可与其相关数据的真实性。数字签名可实现不可抵赖性。 与纸质签名类比 原题关注：数字签名为确保真实性工具 Anonymity 匿名性：确保特定的记录或者交易不归因于任何个体的属性。 不希望隐私泄露，如个体的医疗记录、购物记录等 确保匿名性的方法： 数据聚集(Aggregation) 数据混淆(Mixing) 使用代理(Proxy) (笑死) 使用化名(Pseudonym) 2. 十大安全原则 机制的经济性 故障安全默认配置 完备调停 ……这么多条考个锤子 3. 【重点】四种控制访问模型 访问控制矩阵：定义访问权限的表。 优点： 很容易确定主客体对的访问控制权限； 管理者能够简单、直观地观察访问控制； 关系控制粒度细。 缺点： 缺乏可扩展性，访问控制矩阵有可能会很大。 个人总结：详尽但是体积庞杂 访问控制列表：对于每个客体o，定义列表L， L为客体o的访问控制列表，该列表列举了所有对客体o有访问权限的主体。 优点： 与访问控制矩阵比小很多，可将客体的列表以元数据形式存储。 缺点： 枚举每个主体的访问权限复杂度高。这种枚举是必须的，例如将一个主体从系统中移除的时候。 个人总结：精炼但关系复杂 ​ 能力列表：本质上，能力列表使用访问控制矩阵的每一行并忽略其空白单元格。 优缺点与访问控制列表类似。 基于角色的访问控制：定义角色，并对角色指派访问控制权限，而不是直接对主体。 优点： 存储高效，降低需要记录的规则数量 缺点： 在目前操作系统中未实现。 个人总结：不错，牛逼，很好，不过在梦里才有。 3. 【重点】加密概念 加密(Encryption)：一种手段使得通信双方(Alice和Bob)在易受窃听的不安全信道上建立保密通信。 比如两方通信经过加密解密算法，关键词：对称与非对称加密，公钥私钥 数字签名(Digital Signatures)：公钥加密体制可以用来构造数字签名。 密码学哈希函数(Cryptographic Hash Function)：消息M的一个校验和，需要满足单向性和抗碰撞性。 消息认证码(Message Authentication Codes)：共享密钥，A发送消息与其哈希值，B收到消息再本地验证所收到消息的哈希值。 数字证书：比如https，可信机构对网站颁布证书 4. 实现和可用性相关问题 效率和可用性：计算机安全解决方案应该高效； 【基本理解】对密码的字典攻击：暴力破解会逐一尝试所有可能的组合密码，而字典式攻击会使用一个预先定义好的单词列表(可能的密码)； 社会工程(Social Engineering) …… 二、物理安全 1. 弹子锁 钥匙凹凸对应锁内圆柱高低分布 变成了__…

Python实现图像配准和拼接
type: item
date: 2022-10-26T19:12:00+08:00
description: 题目内容 自行拍摄同一场景不同角度的两幅图像,编程实现图像的拼接： 基于图像特征点提取的相关内容,选择相关特征点匹配算法(SIFT、SURF、HOG)完成特征点提取； 利用 RANSAC 算法实现特征点匹配； 利用图像几何变换算法实现图像变换和拼接。 原理分析 操作步骤： 给定图像，调用 opencv 库中 SIFT（SURF，HOG）算子分别对两幅图像进行特征点提取,计算获得特征点及其描述子； 对第一步两张图片的结果进行匹配，具体方法有 BF(Brute-Force),暴力特征匹配方法和 FLANN 最快邻近区特征匹配，最终获得匹配点； 利用 RANSAC 算法，计算单应性矩阵，去除误匹配点，获得内点； 对第一幅图像进行透视变换，将第二幅图像复制到变换后的图像上，得到拼接后的图像。 SIFJ 原理： 建立高斯差分金字塔 首对图像做不同尺度的高斯模糊； 对图像做降采样(隔点采样)。 关键点的确定 选取图像的局部极值点； 局部极值点的确定主要通过将该位置像素点与空间中相邻的 26 个点比较。 构建关键点描述子 将 16x16 窗口划分为 4x4 单元格； 为每个像素计算边缘方向， 为边缘方向建立直方图； 计算每个单元格的方向直方图，16 个单元格 * 8 方向 = 128 维描述符； 将该 128 维向量归一化到单位长度。 RANSAC 的算法步骤: 假定模型（如直线方程），并随机抽取 N 个（以 2 个为例）样本点，对模型进行拟合； 由于不是严格线性，数据点都有一定波动，假设容差范围为： sigma，找出距离拟合曲线容差范围内的点，并统计点的个数； 重新随机选取 N 个点，重复第一步~第二步的操作，直到结束迭代； 每一次拟合后， 容差范围内都有对应的数据点数，找出数据点个数最多的情况，就是最终的拟合结果。 设计与实现 使用语言：Python 使用的库：opencv-python, numpy, matplotlib.pyplot 注：由于 SIFT（现已版权到期）和 SURF 的版权问题，使用 python 为 3.7 版本，opencv-python库版本为 3.4.2.16 特征点提取，选择特征点匹配算法 def feature_points_extraction(src: np.ndarray, method: str) -> tuple: if method == 'SIFT': sift = cv.xfeatures2d.SIFT_create() kp, des = sift.detectAndCompute(src, None) elif method == 'SURF': surf = cv.xfeatures2d.SURF_create() kp, des = surf.detectAndCompute(src, None) elif method == 'HOG': hog = cv.HOGDescriptor() kp, des = hog.compute(src) else: raise ValueError('method error') return kp, des特征点匹配及图像拼接 特征点匹配及图像拼接 def feature_points_matching(src1: np.ndarray, src2: np.ndarray, method: str): kp1, des1 = feature_points_extraction(src1, method) kp2, des2 = feature_points_extraction(src2, method) FLANN_INDEX_KDTREE = 0 # 建立FLANN匹配器的参数 index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) # 配置索引，密度树的数量为5 search_params = dict(checks=50) # 指定递归次数 match = cv.FlannBasedMatcher(index_params, search_params) # 建立匹配器 matches = match.knnMatch(des1, des2, k=2) # 得到匹配的关键点 good = [] # 良好的匹配点 for m, n in matches: # 通过比值测试筛选出好的匹配点 if m.distance < 0.75 * n.distance: # 0.75是经验值 good.append([m]) if len(good) > MIN: src_pts = np.float32([kp1[m[0].queryIdx].pt for m in good]).re…

Python实现Sobel及Canny边缘检测
type: item
date: 2022-10-04T00:03:00+08:00
description: 题目内容 自选一张图像，编程实现以下操作： • 分别采用 Sobel 算子和 Canny 算子滤波，进行边缘提取； • 显示原始图像以及不同滤波器滤波后的结果； • 对于 Sobel 滤波结果，显示 x 方向的梯度、y 方向的梯度、梯度幅度、梯度角度等； • 对于 Canny 算子滤波，显示滤波后边缘检测结果，并分析不同滤波结果的差异。 原理分析 Sobel 算子原理分析 Sobel算子是高斯导数的一般近似，是多用于边缘检测的离散性差分算子。 Sobel算子有两组不同的卷积因子 S_x,S_y.可以为一张图片做水平和垂直方向的平面卷积。 S_x = \left[ \begin{matrix} -1 & 0 & +1\\ -2 & 0 & +2 \\ -1 & 0 & +1 \end{matrix} \right] S_y = \left[ \begin{matrix} -1 & -2 & -1\\ 0 & 0 & 0 \\ +1 & +2 & +1 \end{matrix} \right] 假设要对一张图中的（ x,y ） 像素 (预设图片已处理为uint8格式) 使用Sobel算子，首先分别用两个卷积因子分别对该点做卷积。 x方向上的卷积为： G_x=A*S_x y方向上的卷积为： G_y=A*S_y 那么，该点的梯度幅值和方向为： G=\sqrt{G_x^2+G_y^2} θ=arctan (G_y/G_x) 如果梯度幅值G大于了阈值，那么这个点就可以被考虑成边缘点。 Canny 算子原理分析 Canny 算子是计算机视觉中应用最广泛的边缘检测算子之一。 Canny 算子进行边缘检测的步骤： 用高斯导数进行滤波降噪 现实中由于采集设备、环境干扰等多方面的原因导致采集到的图像信息都是含有大量噪声信息的, 高斯滤波可以将图像中的噪声部分过滤出来，使图像更平滑。 高斯滤波处理在图像上反映出来的是一个加权平均的过程，距离中心点越近的部分，其权重越大，反之越小，而权值的分布，则符合正态分布，对于一个二维图像来说，则符合二维高斯分布。 高斯滤波器（ksize = 5 , k = 2）的计算公式如下： G[i,j]=\frac{1}{ 2πσ^2 } e^{-\frac{(i-k-1)^2+(j-k-1)^2}{2σ^2}} 计算获得高斯卷积核后，对图像进行卷积操作。 获得梯度的幅值与方向 利用上述[1. Sobel 算子原理分析]，对平滑后的图像用Sobel算子进行卷积处理，获得图像的梯度幅值数组与方向数组。 非最大值抑制（NMS） 通俗意义上是指寻找像素点局部最大值，将非极大值点所对应的灰度值置为0，这样可以剔除掉一大部分非边缘的点。 首先要确定像素点C的灰度值在其8值邻域内是否为最大。 图1中蓝色的线条方向为C点的梯度方向，这样就可以确定其局部的最大值一定分布在这条线上，即出了C点外，梯度方向的交点dTmp1和dTmp2这两个点的值也可能会是局部最大值。 因此，判断C点灰度与这两个点灰度大小即可判断C点是否为其邻域内的局部最大灰度点。如果经过判断，C点灰度值小于这两个点中的任一个，那就说明C点不是局部极大值，那么则可以排除C点为边缘。 阈值化边缘: 设定双阈值（滞后阈值） T1>T2 Step1: 当边缘像素强度>T1时，该边缘保留 Step2：对T1>边缘像素强度>T2，当其与强边缘连接时才是边缘 找连通域（8个方向） 设计与实现 使用语言：Python 使用的库：opencv - python, numpy, matplotlib.pyplot 源码：test.py, main.py(见文件) 主要功能函数： 边缘补偿 def padding(image: np.ndarray, ksize: int) -> np.ndarray: '''在进行卷积操作前，对图像边缘进行补偿，避免边缘像素损失 ksize: 卷积核大小 pad: 需要补偿的边缘像素宽度 pad计算公式: pad = ksize//2 返回值： padded_out ''' h, w = image.shape[0], image.shape[1] pad = ksize//2 padded_out = np.zeros((h+2*pad, w+2*pad)) out_copy = image.copy() padded_out[pad:pad+h, pad:pad+w] = np.uint8(out_copy) return padded_out Sobel算子 def sobel_filter(image: np.ndarray): '''利用Sobel算子对图像进行卷积 sobelX = np.array([[-1, -2, -1], [0, 0, 0],…

LINUX学习笔记——Shell scripts
type: item
date: 2022-07-24T00:23:00+08:00
description: TNND，终于到这里了 Hello World 什么经典开局 程序样例 [aweip@manjaro ~]$ mkdir bin; cd bin [aweip@manjaro ~]$ vim hello.sh #!/bin/bash # Program: # To shows "Hello World!" # History: # 2022/07/24 AweiP First release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "Hello World! \a \n" exit 0 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称 程序内容的说明： 除了第一行的『 #! 』是用来宣告 shell 的之外，其他的 # 都是『批注』用途 ，第二行以下就是用来说明整个程序的基本数据。 主要环境变量的宣告 ： 务必要将一些重要的环境变量设定好 主要程序部分 ：这个例子当中，就是 echo 那一行 执行成果告知 (定义回传值) ：利用 exit 这个指令来让程序中断，并且回传一个数值给系统 执行结果 [aweip@manjaro ~]$ sh hello.sh Hello World ! 简单加减乘除求余(即+-*/%) [aweip@manjaro ~]$ vim multiplying.sh #!/bin/bash # Program: # Inputs 2 integer numbers; program will cross these two numbers. # History: # 2022/07/24 PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH echo -e "Input 2 numbers\n" read -p "first: " firstnu read -p "second: " secnu total=$((${firstnu}*${secnu})) echo -e "\nThe result of ${firstnu} x ${secnu} is ==> ${total}" script 的执行方式差异 (source, sh script, ./script) 直接执行的方式来执行 script sh test.sh 使用这种执行方式时， script 是在子程序的 bash 内执行 ，当test.sh 执行完毕后， 子程序 bash 内的所有数据便被移除 （变量作用域仅在fork出的子程序中） 利用 source 来执行脚本：在父程序中执行 source test.sh 善用判断式 利用 test 指令的测试功能 例子：test -e /dmtsai && echo "exist" || echo "Not exist" 关于某个档名的『文件类型』判断 测试的标志 代表意义 -e 该『档名』是否存在？ (常用) -f 该『档名』是否存在且为文件(file)？ (常用) -d 该『文件名』是否存在且为目录(directory)？ (常用) 关于文件的权限侦测，如 test -r filename 表示可读否 (但 root 权限常有例外) 测试的标志 代表意义 -r 侦测该档名是否存在且具有『可读』的权限？ -w 侦测该档名是否存在且具有『可写』的权限？ -x 侦测该档名是否存在且具有『可执行』的权限？ -u 侦测该文件名是否存在且具有『SUID』的属性？ -g 侦测该文件名是否存在且具有『SGID』的属性？ -s 侦测该档名是否存在且为『非空白文件 ​ ....... 利用判断符号 [ ]