├── 未命名.txt ├── README.md ├── FPGA ├── 8.5 多功能数字钟设计.md ├── 1 数字逻辑设计基础.md └── 寄存器和移位寄存器.md ├── digital-signal-processing ├── 4.3 DIF.md ├── 4 快速傅里叶变换.md ├── 1.绪论.md ├── 14.FIR数字滤波器的基本结构.md ├── 18.IIR数字滤波器的基本结构.md ├── 4.2 DIT.md ├── 4.连续时间信号的抽样.md └── 7.离散系统的频域表征.md ├── digital-image-processing ├── README.md ├── III │ ├── 3.7 DCT变换编码.md │ ├── 3.8基于小波变换编码.md │ ├── 3.4 行程编码.md │ ├── 3.3 香农-范诺编码.md │ ├── 3.2 Huffman编码.md │ ├── 3.9 混合编码.md │ ├── 3.10 预测编码.md │ ├── 3.6 算术编码.md │ ├── 3.5 LZW编码 .md │ ├── 3.12 编程实例.md │ ├── 3.11 JPEG编码.md │ └── 3.1 图像编码概述.md ├── IV │ ├── 4.1 引言.md │ ├── 4.4 图像噪声.md │ ├── 4.7 图像的伪彩色处理.md │ ├── 4.3 灰度变换.md │ ├── 4.9 编程实例.md │ └── 4.8 常见滤波器.md ├── II │ ├── 2.1 频域世界与频域变换.md │ ├── 2.3 频域变换的一般表达式.md │ ├── 2.4 离散余弦变换.md │ ├── 2.6 实现图像变换的VC++编程.md │ ├── 2.5 离散沃尔什-哈达玛变换(WHT).md │ └── 2.7 小波变换简介.md ├── V │ ├── 5.3 逆滤波.md │ ├── 5.2 代数复原法.md │ ├── 5.4 最小二乘滤波(维纳滤波,重点).md │ ├── 5.7 编程实例.md │ ├── 5.6 其他图像复原技术.md │ └── 5.5 非线性复原方法 .md ├── VII │ ├── 7.3 轮廓跟踪与提取.md │ ├── 7.4 Hough 变换.md │ └── 7.2 边缘检测.md ├── 1 概论.md ├── I │ └── 1 概论.md ├── VIII │ ├── 8.1 引言.md │ ├── 8.4 形态学的应用.md │ └── 8.3 灰值形态学.md └── VI │ ├── 6.7 透视变换.md │ ├── 6.3 图像平移.md │ ├── 6.8 应用实例.md │ ├── 6.4 图像镜像.md │ ├── 6.1 几何变换基础.md │ ├── 6.2 图像比例缩放.md │ └── 6.5 图像旋转.md ├── 电赛总结 └── 2023 │ └── 2023-D-信号调制方式识别及参数测量装置.md └── analog ├── DAC.md └── 新型有源滤波器.md /未命名.txt: -------------------------------------------------------------------------------- 1 | H 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # coral 2 | 全国大学生电子设计竞赛知识仓库 3 | -------------------------------------------------------------------------------- /FPGA/8.5 多功能数字钟设计.md: -------------------------------------------------------------------------------- 1 | # 8.5 多功能数字钟设计 2 | 3 | -------------------------------------------------------------------------------- /digital-signal-processing/4.3 DIF.md: -------------------------------------------------------------------------------- 1 | # $4.3$ 按频率抽选 (DIF) 的基-2 FFT算法 2 | 3 | -------------------------------------------------------------------------------- /digital-image-processing/README.md: -------------------------------------------------------------------------------- 1 | # Digital-mage-Processing 2 | 数字图像处理笔记,整理张航老师的数字图像处理课件,推荐教材是冈萨雷斯第四版 3 | 4 | 现在已经初步整理完毕,但不排除个别地方仍然有细微错误。 -------------------------------------------------------------------------------- /FPGA/1 数字逻辑设计基础.md: -------------------------------------------------------------------------------- 1 | # 1 数字逻辑基础 2 | 3 | 数字电路的发展历史及分类 4 | 5 | 逻辑运算及逻辑门 6 | 7 | 逻辑代数的基本公式和规则 8 | 9 | 逻辑函数的代数化简法 10 | 11 | 逻辑函数的卡诺图化简法 12 | 13 | 组合逻辑电路设计 14 | -------------------------------------------------------------------------------- /digital-image-processing/III/3.7 DCT变换编码.md: -------------------------------------------------------------------------------- 1 | # 3.7 DCT变换编码 2 | 3 | 注意 4 | 作DCT变换时,一般不是对整个图象作一次变换,而是将图象划为8*8或16*16的子图象,然后对各个子图象作DCT变换. 5 | 6 | 采用快速DCT变换 7 | 8 | image-20230419201138897 -------------------------------------------------------------------------------- /digital-image-processing/IV/4.1 引言.md: -------------------------------------------------------------------------------- 1 | # 4.1 引言 2 | 3 | 通过一些运算来突出图像的某些信息,如轮廓等.但通过运算的图像不一定逼近原图像. 4 | 图像增强: 5 | 6 | - 空间域法 7 | 8 | $$ 9 | g(x,y)=h(x,y)*f(x,y) 10 | $$ 11 | - 频域法 12 | 13 | $$ 14 | \stackrel{F(x, y)}{\longrightarrow} \boxed{正交变换} \stackrel{F(u, v)}{\longrightarrow} \boxed{修正H(u,v)} \stackrel{G(u, v)}{\longrightarrow} \boxed{逆变换} \stackrel{G(x, y)}{\longrightarrow} 15 | $$ 16 | -------------------------------------------------------------------------------- /FPGA/寄存器和移位寄存器.md: -------------------------------------------------------------------------------- 1 | # 寄存器 2 | 3 | 4 | 5 | --- 6 | 7 | ### 不同位宽赋值 8 | 9 | 位宽多的赋给少的:舍弃高位 10 | 11 | 位宽少的赋给多的:高位补0 12 | 13 | --- 14 | 15 | 16 | 17 | 18 | 19 | ```verilog 20 | module register//verilog 2001,2005 syntax 21 | #(parameter N=8) 22 | ( 23 | output reg [N-1:0]Q, 24 | ... 25 | ) 26 | ... 27 | endmodule 28 | 29 | ... 30 | register U1 #(16)(...) 31 | ... 32 | ``` 33 | 34 | # 移位寄存器 35 | 36 | 可通过<<和>>操作符以及并位操作符实现 37 | 38 | - 逻辑左移和算术左移等同 39 | - 逻辑右移当作无符号数,最高位补0 40 | - 算术右移最高位补符号位 41 | 42 | -------------------------------------------------------------------------------- /digital-image-processing/II/2.1 频域世界与频域变换.md: -------------------------------------------------------------------------------- 1 | # 2.1 频域世界与频域变换 2 | 3 | image-20230427142219668 4 | 5 | 图2-1 任意波形可分解为正弦波的加权和 6 | 7 | ![image-20230427142312904](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230427142312904.png) 8 | 9 | 图2-2 正弦波的振幅 $A$ 和相位 $\varphi$ 10 | 11 | image-20230427142411844 12 | 13 | 图2-3 图2-1(a)波形的频域表示 14 | (a) 幅频特性; (b) 相频特性 15 | 16 | 时域和频域之间的变换可用数学公式表示如下: 17 | $$ 18 | f(f){\Leftrightarrow} A(f), \Phi(f)\tag{2-1} 19 | $$ 20 | 为能同时表示信号的振幅和相位,通常采用复数表示法,因此式(2-1)可用复数表示为 21 | $$ 22 | f(f)\Leftrightarrow F(f)\tag{2-2} 23 | $$ 24 | 完成这种变换,一般采用的方法是线性正交变换。 25 | -------------------------------------------------------------------------------- /digital-signal-processing/4 快速傅里叶变换.md: -------------------------------------------------------------------------------- 1 | # 4 快速傅里叶变换(FFT) 2 | 3 | ## FFT发展史 4 | 5 | ## 为什么计算FFT 6 | 7 | ### 直接算DFT的问题 8 | 9 | 运算量 10 | 11 | ### 旋转因子及其特性 12 | 13 | 旋转因子 14 | $$ 15 | W_N^{n k}=e^{-j \frac{2 \pi}{N} n k} 16 | $$ 17 | 18 | - 周期性 19 | 20 | $$ 21 | W_N^{n(N+k)}=W_N^{k(N+n)}=W_N^{k n} 22 | $$ 23 | 24 | - 对称性 25 | 26 | $$ 27 | \left(W_N^{n k}\right)^*=W_N^{-k n}&=W_N^{(N-n) k}&=W_N^{n(N-k)}\\ 28 | &\downarrow&\downarrow\\ 29 | &W_N^{N k} \cdot W_N^{-n k} 30 | &W_N^{n N} \cdot W_N^{-n k} 31 | $$ 32 | 33 | - 可约性 34 | 35 | $$ 36 | W_N^{n k k}=W_{m N}^{m m k}, W_N^{n k}=W_{N / m}^{n k / m} 37 | $$ 38 | 39 | - 特殊点 40 | 41 | $$ 42 | W_N^0=1, \quad W_N^{N / 2}=-1, \quad W_N^{k+N / 2}=-W_N^k 43 | $$ 44 | 45 | ### FFT算法的基本思想 46 | 47 | 利用 DFT系数的特性, 合并 DFT运算中的某些项, 把长序列 DFT $\rightarrow$ 短序列 DFT, 从而减少其运算量。 48 | 49 | ### FFT算法分类 50 | 51 | - 时间抽选法 DIT: Decimation-In-Time 52 | - 频率抽选法 DIF: Decimation-In-Frequency 53 | 54 | -------------------------------------------------------------------------------- /digital-image-processing/III/3.8基于小波变换编码.md: -------------------------------------------------------------------------------- 1 | # 3.8基于小波变换编码 2 | 3 | ## 一维小波变换 4 | 5 | ![image-20230419201225871](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419201225871.png) 6 | 7 | 二维小波变换 8 | 一愊图象经小波变换成 $(3 ~J+1)$ 个离笃图象 9 | $$ 10 | \left\{A_J^d f, D_j^1 f, D_j^2 f, D_j^3 f\right\} \quad 1 \leq j \leq J 11 | $$ 12 | 其中 $A_j^d f$ 是 $f$ 在J级分辡卒的低频分量, $D_j^1 f, D_j^2 f$ 分别是水平、坚直方向的细节, $D_j^3 f$ 主要对应 45 度和 135 度方向的高频分量。 13 | 14 | ![image-20230419201314517](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419201314517.png) 15 | 16 | ![image-20230419201340491](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419201340491.png) 17 | 18 | 二维小波分解 19 | 20 | ![image-20230419201349810](C:/Users/16955/AppData/Roaming/Typora/typora-user-images/image-20230419201349810.png) 21 | 22 | 二维小波重建 23 | 24 | 基于小波变换编码原理 25 | 图象的最终目的是让人看, 而人的视觉系统对高频分量不敏感, 因此高频分量可以粗略编码, 而对图象的质量影响不大,并且高频部分有很高的相似性。由于细节部分对应于图象的高频分量, 考虎视觉特点, 它可以用较高的厓缩比编码, 而 $A_J^d f$ 象素个数小, 反映图象的整体轮廓, 对其直接编码, 以保证恢复图象的质量,而对整幅图象的编码圧缩比影响不大。 26 | 27 | ![image-20230419201448473](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419201448473.png) -------------------------------------------------------------------------------- /digital-image-processing/V/5.3 逆滤波.md: -------------------------------------------------------------------------------- 1 | # 5.3 逆滤波 2 | 3 | 只能接近,无法完全恢复 4 | 5 | 1.逆滤波基本原理 6 | 由退化图像的付里叶变换求得图像的付里叶变换的估计方法称为逆滤波. 7 | 8 | 逆滤波 9 | $$ 10 | \begin{aligned} 11 | \overline{g(x, y)}= & \int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f(x, A) h(x-\imath v, y-A) d x d, \partial+n(x, y) \\ 12 | & G(u, v)=F(u, v) H(u, v)+N(u, v) 13 | \end{aligned} 14 | $$ 15 | 不考虑噪声: 16 | 17 | $$ 18 | \begin{aligned} F(u, v) & =\frac{G(u, v)}{H(u, v)} \\ f(x, y) & =\mathcal{G}^{-1}[F(u, v)]\end{aligned} 19 | $$ 20 | 有噪声: 21 | $$ 22 | \begin{aligned} 23 | & F(u, v)=\frac{G(u, v)}{H(u, v)}-\frac{N(u, v)}{H(u, v)} \\ 24 | & f(x, y)=\xi^{-1}[F(u, v)] 25 | \end{aligned} 26 | $$ 27 | 28 | 29 | 30 | 31 | ![image-20230321193422038](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230321193422038.png) 32 | 33 | 图5.2 逆滤波 34 | 35 | 逆滤波 36 | 2.去除由均匀直线运动引起的模糊 37 | - 模糊模型 38 | $$ 39 | g(x, y)=\int_0^T f\left[x-x_0(t), y-y_0(t)\right] d t 40 | $$ 41 | $f(x, y)$ : 原图像; $g(x, y)$ : 模糊图像; $T$ : 暴光时间 42 | - 图像恢复 $G(u, v)=H(u, v) F(u, v)$ 43 | 其中: $H(u, v)=\int_0^T \exp \left\{-j 2 \pi\left[u x_0(t)+v y_0(t)\right]\right\} d t$ 44 | 45 | ## 用途 46 | 47 | 在实验室中,可以反复做实验的情景 -------------------------------------------------------------------------------- /digital-image-processing/V/5.2 代数复原法.md: -------------------------------------------------------------------------------- 1 | # 5.2 代数复原法 2 | 3 | ## 5.2.1非约束复原方法 4 | 5 | 由式(5-24)可得 6 | $$ 7 | n=g-H f\tag{5-25} 8 | $$ 9 | 在对 $n$ 没有先验知识的情况下, 可以依据这样的最优准则, 即寻找一个 $\hat{f}$, 使得 $H \hat{f}$ 在最小二乘方误差的意义下最按近 $g$, 即要使 $n$ 的模或范数 (norm) 最小: 10 | $$ 11 | \|n\|^2=n^T n=\|g-H \hat{f}\|^2=(g-H \hat{f})^T(g-\hat{H f})\tag{5-26} 12 | $$ 13 | 即优化目标为: 14 | $$ 15 | L(\hat{f})=\|g-H \hat{f}\|^2\tag{5-27} 16 | $$ 17 | 如果我们在求最小值的过程中, 不做任何约束, 称这种复原为非约束复原。由极值条件 18 | $$ 19 | \frac{\partial L(\hat{f})}{\partial \hat{f}}=0 \Rightarrow H^T(g-H \hat{f})=0\tag{5-28} 20 | $$ 21 | 解出 $\hat{f}$ 为 22 | $$ 23 | \hat{f}=\left(H^T H\right)^{-1} H^T g\tag{5-29} 24 | $$ 25 | 26 | ## 5.2.2 约束复原法 27 | 28 | 非约束复原是指除了使准则函数 $L(\hat{f})=\|g-\hat{H f}\|^2$ 最小外, 再没有其他的约束条件。因此只需了解降质系统的传递函数或点扩展函数, 就能利用如前所述的方法进行复原。但是由于传递函数存在病态问题, 复原只能局限在靠近原点的有限区域内进行, 这使得非约束图像复原具有相当大的局限性。 29 | 30 | 最小二乘类约束复原是指除了要求了解关于退化系统的传递函数之外, 还需要知道某些噪声的统计特性或噪声与图像的某些相关情况。根据所了解的噪声的先验知识的不同, 采用不同的约束条件, 可得到不同的图像复原技术。在最小二乘类约束复原中, 要设法寻找一个最优估计 $\hat{f}$, 使得形式为 $\|Q \hat{f}\|^2=\|n\|^2$ 的函数最小化。求这类问题的最小化, 常采用拉格朗日乘子算法。也就说, 要寻找一个 $\hat{f}$, 使得优化目标函数: 31 | $$ 32 | J(\hat{f})=\|\hat{O \hat{f}}\|^2+\alpha\left(\|g-H \hat{f}\|^2-\|n\|^2\right)\tag{5-30} 33 | $$ 34 | 为最小。式中, $Q$ 为 $\hat{f}$ 的线性算子, $\alpha$ 为一常数, 称为拉格朗日乘子。对式(5-30)求导得 35 | $$ 36 | \begin{aligned} 37 | & \frac{\partial J(\hat{f})}{\partial f}=0 \\ 38 | & Q^T Q \hat{f}-\alpha H^T(g-H \hat{f})=0 39 | \end{aligned} 40 | $$ 41 | 求解 $\hat{f}$ 得到 42 | $$ 43 | \hat{f}=\left(H^T H+\gamma Q^T Q\right)^{-1} H^T g\tag{5-31} 44 | $$ -------------------------------------------------------------------------------- /digital-image-processing/IV/4.4 图像噪声.md: -------------------------------------------------------------------------------- 1 | # 4.4 图像噪声 2 | 3 | 重点:均值滤波法s 4 | 5 | ## 4.4.1 概述 6 | 7 | 噪声可以理解为“妨碍人们感觉器官对所接收的信源信息理解的因素” 。例如,一幅黑白图像,其亮度分布假定为$f (x, y)$, 那么对其起干扰作用的亮度分布$R(x, y)$便称为图像噪声。噪声在理论上可以定义为“不可预测, 只能用概率统计方法来认识的随机误差” 。因此,将图像噪声看成是多维随机过程是合适的, 描述噪声的方法完全可以借用随机过程及其概率分布函数和概率密度函数。但在很多情况下,这种描述方法很复杂,甚至不可能,而且实际应用往往也不必要,通常是用其数字特征,即均值方差、相关函数等进行处理。 8 | 9 | 目前,大多数数字图像系统中,输入光图像都是采用先冻结再扫描方式将多维图像变成一维电信号,再对其进行处理、存储、 传输等加工,最后往往还要再组成多维图像信号。图像噪声同样也受到这样的分解和合成,在这些过程中电气系统和外界影响将使得图像噪声的精确分析变得十分复杂。另一方面, 对图像信息的认识和理解是由人的视觉系统所决定的。不同的图像噪声,人的感觉(理解)程度是不同的,这就是所谓人的噪声视觉特性问题。该方面虽早已进行研究,但终因人的视觉系统本身未搞清楚而未获得解决。尽管如此,图像噪声在数字图像处理技术中的重要性却愈加明显。例如,高放大倍数遥感图片的判读,X射线图像系统中的噪声去除等都已成为不可缺少的技术。 10 | 11 | ## 4.4.2 图像噪声分类 12 | 13 | 图像噪声按其产生的原因可分为外部噪声和内部噪声。 14 | 15 | 外部噪声是指系统外部干扰从电磁波或经电源传进系统内部而引起的噪声,如电气设备、天体放电现象等引起的噪声。 主要外部干扰如下: 16 | 17 | (1) 由光和电的基本性质所引起的噪声。 18 | 19 | (2) 电器的机械运动产生的噪声。如, 各种接头因抖动引起的电流变化所产生的噪声;磁头、磁带抖动引起的抖动噪声等。 20 | 21 | (3) 元器件材料本身引起的噪声。如, 磁带、磁盘表面缺陷所产生的噪声。 22 | 23 | (4) 系统内部设备电路所引起的噪声。如, 电源系统引入的交流噪声,偏转系统和箝位电路引起的噪声等。 24 | 25 | 图像噪声从统计特性可分为平稳噪声和非平稳噪声两种。 统计特性不随时间变化的噪声称为平稳噪声;统计特性随时间变化的噪声称为非平稳噪声 26 | 27 | 另外, 按噪声和信号之间的关系可分为加性噪声和乘性噪声。假定信号为 $S(t)$, 噪声为 $n(t)$, 如果混合叠加波形是 $S(t)+n(t)$ 形式, 则称其为加性噪声; 如果叠加波形为 $S(t)[1+n(t)]$ 形式, 则称其为乘性噪声。为了分析处理方便, 往往将乘性噪声近似认为加性噪声, 而且总是假定信号和噪声是互相独立的。 28 | 29 | ## 4.4.3 图像系统噪声特点 30 | 31 | 如图4-16是一幅含有噪声的图像, 由此可知图像中的噪声有以下三个特点。 32 | 33 | 1. 噪声在图像中的分布和大小不规则 34 | 2. 噪声与图像之间具有相关性 35 | 3. 噪声具有叠加性 36 | 37 | ![image-20230423194824007](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230423194824007.png) 38 | 39 | 图4-16 有噪声的图像 -------------------------------------------------------------------------------- /digital-image-processing/III/3.4 行程编码.md: -------------------------------------------------------------------------------- 1 | # 3.4 行程编码 2 | 3 | ## 3.4.1 行程编码基本方法 4 | 5 | ​ 行程编码又称行程长度编码(Run Length Encoding, RLE), 是一种熵编码,其编码原理相当简单,即将具有相同值的连续串用其串长和一个代表值来代替, 该连续串就称为行程,串长称为行程长度。例如,有一字符串“aabbbcddddd”, 则经行程长度编码后, 该字符串可以只用“2a3b1c5d”来表示。 6 | ​ 行程编码分为定长和不定长编码两种。定长编码是指编码的行程长度所用的二进制位数固定,而变长行程编码是指对不同范围的行程长度使用不同位数的二进制位数进行编码。使用变长行程编码需要增加标志位来表明所使用的二进制位数。 7 | 8 | 行程编码比较适合于二值图像的编码,一般用于量化后出现大量零系数连续的场合,用行程来表示连零码。如果图像是由很多块颜色或灰度相同的大面积区域组成的,那么采用行程编码可以达到很高的压缩比。如果图像中的数据非常分散,则行程编码不但不能压缩数据,反而会增加图像文件的大小。为了达到较好的压缩效果,一般不单独采用行程编码, 而是和其他编码方法结合使用。例如, 在JPEG中, 就综合使用了行程编码、DCT、量化编码以及哈夫曼编码, 先对图像作分块处理, 再对这些分块图像进行离散余弦变换(DCT), 对变换后的频域数据进行量化并作Z字形扫描,接着对扫描结果作行程编码, 对行程编码后的结果再作哈夫曼编码。 9 | 10 | ## 3.4.2 PCX文件中的行程编码 11 | 12 | PCX文件分为文件头和图像压缩数据两个部分。如果是256色图像,则还有一个256色调色板存于文件尾部。文件头全长128字节,包含了图像的大小和颜色以及PCX文件的版本标识等信息,图像压缩数据紧跟在文件头之后。如果没有使用调色板, 那么图像压缩数据存储的是实际像素值;否则,存储的是调色板的索引值。当压缩数据是实际的像素值时,它们按颜色平面和扫描行存储,即每行先存储所有R分量,再存储所有G分量, 最后存储所有B分量,一行数据存储完后,接着存储下一行数据。如果使用了调色板,则不会分解为单独的颜色平面存储。读者可以查阅图像文件格式的相关书籍了解PCX文件的详细格式。下面以256色PCX文件为例, 说明PCX文件中的行程编码。 13 | 14 | 在256色PCX文件中,每个像素占一字节, 压缩数据以字节为单位逐行进行编码,每行填充到偶数字节。PCX文件规定编码时的最大行程长度为63,如果行程长度大于63,则必须分多次存储。对于长度大于1的行程,编码时先存入其行程长度(长度L加上192即0xC0),再存入该行程的代表值,行程长度和行程的代表值分别占一字节。对于长度为1的行程,即单个像素, 如果该像素的值小于或等于0xC0, 则编码时直接存入该像素值, 而不存储长度信息;否则,先存入0xC1,再存入该像素值,这样做的目的是为了避免该像素值被误认为长度信息。例如,连续100个灰度值为0x80的像素, 其编码(以十六进制表示)应为FF 80 25 80。上面的编码中出现FF的长度信息是由63与0xC0相加所得。 15 | 16 | 对256色PCX文件解码时,首先从压缩数据部分读取一个字节,判断该值是否大于0xC0,如果是,则表明该字节是行程长度信息, 取其低六位(相当于减去0xC0)作为行程长度L,读取下一个字节作为像素值并重复L次存入图像数据缓冲区;否则, 直接将该字节存入图像数据缓冲区。 17 | 18 | 虽然几乎所有的图像应用软件都支持PCX文件格式,但由于它的压缩比不高, 因而现在用得不是很多。 -------------------------------------------------------------------------------- /digital-image-processing/VII/7.3 轮廓跟踪与提取.md: -------------------------------------------------------------------------------- 1 | # 7.3 轮廓跟踪与提取 2 | 3 | ## 7 .3.1 轮廓跟踪 4 | 5 | 在识别图像中的目标时,往往需要对目标边缘作跟踪处理,也叫轮廓跟踪。顾名思义, 轮廓跟踪就是通过顺序找出边缘点来跟踪边界的。若图像是二值图像或图像中不同区域具有不同的像素值,但每个区域内的像素值是相同的,则如下算法可完成基于4连通或8连通区域的轮廓跟踪。 6 | 7 | 步骤1:首先按从上到下, 从左到右的顺序扫描图像, 寻找没有标记跟踪结束记号的第一个边界起始点 $A 0, ~A 0$ 是具有最小行和列值的边界点。定义一个扫描方向变量dir, 该变量用于记录上一步中沿着前一个边界点到当前边界点的移动方向, 其初始化取值为 8 | (1) 对4连通区域取dir = 3, 如图 7 -12(a) 所示; 9 | (2) 对8连通区域取dir = 7, 如图 7 -12(b)所示。 10 | 11 | ![image-20230329165554406](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329165554406.png) 12 | 13 | 图7-12 方向变量的初始化 14 | 15 | (b) 步骤2:按逆时针方向搜索当前像素的 $3 \times 3$ 邻域, 其起始搜索方向设定如下: 16 | 17 | (1) 对4连通区域取(dir + 3)mod 4, 如图 7 -13(a)所示; 18 | 19 | (2) 对8连通区域, 若dir为奇数取(dir + 7)mod 8, 如图 7 - 20 | 21 | 13(b)所示; 若dir为偶数取(dir + 6) $\bmod 8$, 如图 $7-13$ (c)所示。 22 | 23 | ![image-20230329165626747](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329165626747.png) 24 | 25 | 图 7-13 3×3邻域起始搜索方向 26 | 27 | 在3×3邻域中搜索到的第一个与当前像素值相同的像素便为新的边界点 $A_{n}$, 同时更新变量dir为新的方向值。 28 | 29 | 步骤3: 如果 $A_{n}$ 等于第二个边界点 $A_{1}$ 且前一个边界点 $A_{n-1}$ 等于第一个边界点 $A_{0}$, 则停止搜索, 结束跟踪, 否则重复步骤2继续搜索。 30 | 31 | 步骤4: 由边界点 $A_{0} 、 A_{1} 、 A_{2} 、 \ldots 、 A_{n-2}$ 构成的边界便为要跟踪的边界。 32 | 33 | 算法中步骤1中所采用的准则称为 “探测准则”,其作用是找出第一个边界点;步骤3中所采用的准则称为 “跟踪准则”, 其作用是找出所有边界点。 34 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-24.jpg?height=572&width=2100&top_left_y=410&top_left_x=244) 35 | 36 | 图 7-14 轮廓跟踪示例 37 | 38 | ## 7.3.2 轮廓提取 39 | 40 | 二值图像轮廓提取的算法非常简单,就是掏空内部点: 如 41 | 42 | 果原图像中有一点为黑, 且它的8个邻点都是黑色时, 说明该点是内部点, 将该点删除(置为白色像素值255)。对图像中所有像素点执行该操作便可完成图像轮廓的提取。 43 | 44 | -------------------------------------------------------------------------------- /电赛总结/2023/2023-D-信号调制方式识别及参数测量装置.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # D题复盘 4 | 5 | 整理人:王琛文 6 | 7 | 日期:2023年9月5日 8 | 9 | 从结果上来看,2023的D题赛道确实是失败了,着实可惜。不过从过程来看,确实学到了很多有用的知识和技术。 10 | 11 | ## 失败的直接原因 12 | 13 | 合规性检查没有通过 14 | 15 | ### 要真正解调 16 | 17 | 不允许使用ADC和DAC:评委认为信号经过ADC采样后不是原来的信号,但这点貌似是湖南赛区评委自己加上的限制,北京赛区允许使用,且评委并非通信领域而是电气领域的学者,因此这点存疑。 18 | 19 | 此外要输出实时波形,因此系统必须具有实时性。 20 | 21 | 解决方法: 22 | 23 | 购置模拟解调模块,通过微控制器来控制这些模块的开关。各模块的连接可以使用飞线(其他学校是这种方案),但个人认为通过PCB+座子连接要更为可靠,也容易复制。 24 | 25 | ### 禁止上位机 26 | 27 | 不可以有图形化界面,理论上说不可以有操作系统。 28 | 29 | 评委认为Jetson Xavier NX属于上位机 30 | 31 | 解决办法: 32 | 33 | 编写一个Shell脚本让Linux系统的开机执行,这样上电后可以去除桌面显示器。实在要显示的话要使用低级的LCD屏或OLED屏。 34 | 35 | 个人认为Linux操作系统的巨大优势舍弃后实在可惜,因此最好想办法保留下来,如果Jetson Xavier NX和树莓派4B等高性能SoC可以使用是最理想的,实在不能使用也可以改成Luckfoc Pico等低性能芯片。 36 | 37 | ## 失败的深层原因 38 | 39 | 模拟电路的技术积累不足,对电赛的本质不够了解 40 | 41 | ### 模拟电路 42 | 43 | 学会模拟电路对于完成赛题是必要的,比如本赛道评委要求使用模拟电路解调。即使是和模拟电路关联不大的赛题,综合测评也要求学会模拟电路。 44 | 45 | ### 电赛的本质 46 | 47 | 电赛的本质是**做题**,不是做工程,因此实现方式会受到限制。 48 | 49 | 据本次比赛的评委说,“需要琢磨出题人的意图”,“要考虑往届类似赛题的实现方式”。 50 | 51 | 尽管赛前程老师、命题会议都明确表示一种实现方式和平台“只要不明确限制就可以使用”,但“明确限制”的界限很难界定,因此选择非传统的实现方式存在风险。 52 | 53 | ## 技术积累 54 | 55 | ### ChatGPT 56 | 57 | ChatGPT可以直接提供强大的生产力,比如生成代码,本次赛题的信号处理算法有相当多的部分是ChatGPT生成的,理论上说,Github提供的Copilot X是比ChatGPT更强的代码生成模型,不过申请苦难,需要以企业名义申请。 58 | 59 | 此外ChatGPT用作技术指导的价值比直接生成内容更有意义。 60 | 61 | 具体使用方案详见coral/tools/ChatGPT.md 62 | 63 | ### Python 64 | 65 | Python的开发效率极高,但执行效率低,主要适合处理业务逻辑 66 | 67 | 如果时间紧迫,可以用python完成全部的算法并部署到Linux嵌入式系统上,反之,核心算法最好使用C和C++实现,编译生成动态链接库由Python调用。 68 | 69 | 即使不用Python来实现赛题,作为一种轻量级的脚本语言用作算法模型验证也是极好的,某些领域甚至强于matlab 70 | 71 | ### Linux 72 | 73 | 操作系统的巨大优势不必多说,但对于电赛,使用Linux系统最大的两个意义还是为了使用Python,以及方便移植。 74 | 75 | -------------------------------------------------------------------------------- /digital-image-processing/III/3.3 香农-范诺编码.md: -------------------------------------------------------------------------------- 1 | # 3.3 香农-范诺编码 2 | 3 | 香农-范诺 (Shannon-Fannon) 编码也是一种常见的可变字长编码。与哈夫曼编码相似, 当信源符号出现的概率正好为 $2^{-i}$ $(i<0)$ 时, 采用香农-范诺编码同样能够达到 $100 \%$ 的编码效率。 香农-范诺编码的理论基础是符号的码字长度 $N_i$ 完全由该符号出现的概率来决定, 即 4 | $$ 5 | -\log _D P_i \leq N_i \leq-\log _D P_i+1\tag{3-8} 6 | $$ 7 | 式中,D为编码所用的数制。 8 | 9 | 香农-范诺编码的步骤如下: 10 | (1)将信源符号按其出现概率从大到小排序; 11 | (2)按照式 (3-8) 计算出各概率对应的码字长度 $N_i$; 12 | (3)计算累加概率 $A_i$, 即 13 | $$ 14 | A_i=A_{i-1}+P_{i-1} \quad i=1,2, \ldots, N-1 ; \quad A_0=0\tag{3-9} 15 | $$ 16 | (4) 把各个累加概率 $A_i$ 由十进制转化为二进制, 取该二进制数的前 $N_i$ 位作为对应信源符号的码字。 17 | 18 | 为便于比较, 仍以例4-1中图像为对象, 对其进行香农-范诺编码, 结果如表3-3所示。由于在此采用二进制对码字赋值, 故在利用式 (3-9) 计算码字长度 $N_i$ 时, $D$ 取为 2 。以符号 $S_4$ 为例, 其出现概率为 0.07 , 按照式 (3-9) 计算得到它的码字长度应为 4 , 按式 (3-10) 计算得到它的累加概率 $A_4$ 为 0.78 , 将 0.78 转化为二进制并取其前 4 位即得符号 $S_4$ 的码字为 1100 (省去了 “0.”, 有的浮点数不能完全转化, 转化时只需完成前 $N_i$ 位即可)。 19 | 20 | 表3-3 香农-范诺编码 21 | 22 | $$ 23 | 平均码长 R=3.17 \quad图像熵 H=2.55 \quad \text { 编㐷效率 } \eta=80.4 \%\\ 24 | \begin{array}{|c|c|c|c|c|c|} 25 | \hline \text { 信源符号 } & \text { 出现概率 } P_i & \text { 码字长度 } N_i & \text { 蔂加概率 } A_i & \text { 转换为二进制 } & \text { 分配码字 } B_i \\ 26 | \hline S_0 & 0.40 & 2 & 0 & 0 & 00 \\ 27 | \hline S_1 & 0.18 & 3 & 0.40 & 01100 & 011 \\ 28 | \hline S_2 & 0.10 & 4 & 0.58 & 10010 & 1001 \\ 29 | \hline S_3 & 0.10 & 4 & 0.68 & 10100 & 1010 \\ 30 | \hline S_4 & 0.07 & 4 & 0.78 & 11000 & 1100 \\ 31 | \hline S_5 & 0.06 & 5 & 0.85 & 1101100 & 11011 \\ 32 | \hline S_6 & 0.05 & 5 & 0.91 & 1110100 & 11101 \\ 33 | \hline S_7 & 0.04 & 5 & 0.96 & 1111010 & 11110 \\ 34 | \hline 35 | \end{array}\\ 36 | 37 | 38 | 39 | $$ 40 | 除此之外, 还有二分法香农-范诺编码方法。其步骤如下: 41 | (1) 首先统计出每个符号出现的概率; 42 | (2) 从左到右对上述概率从大到小排序; 43 | (3) 从这个概率集合中的某个位置将其分为两个子集合,并尽量使两个子集合的概率和近似相等,给前面一个子集合赋值为0, 后面一个子集合赋值为1; 44 | (4) 重复步骤3,直到各个子集合中只有一个元素为止; 45 | (5) 将每个元素所属的子集合的值依次串起来,即可得到各个元素的香农-范诺编码。 46 | 47 | 表3-4 二分法香农-范诺编码 48 | 49 | ![image-20230419200434751](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419200434751.png) -------------------------------------------------------------------------------- /digital-image-processing/II/2.3 频域变换的一般表达式.md: -------------------------------------------------------------------------------- 1 | # 2.3 频域变换的一般表达式 2 | 3 | ## 2.3.1 可分离变换 4 | 5 | 二维傅立叶变换可用通用的关系式来表示: 6 | $$ 7 | F(u, v)=\sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) g(x, y, u, v) 8 | 9 | \tag{2-36} 10 | $$ 11 | $$ 12 | f(x, y)=\sum_{u=0}^{M-1} \sum_{v=0}^{N-1} F(u, v) h(x, y, u, v)\tag{2-37} 13 | $$ 14 | 15 | 式中:$x, u=0, 1, 2, …, M-1$;$y, v=0, 1, 2, …, N-1$;$g(x,y,u,v)$和$h(x,y,u,v)$分别称为正向变换核和反向变换核。 16 | 17 | 如果 18 | $$ 19 | g(x, y, u, v)=g_1(x, u) g_2(y, v)\tag{2-38} 20 | $$ 21 | 22 | $$ 23 | h(x, y, u, v)=h_1(x, u) h_2(y, v)\tag{2-39} 24 | $$ 25 | 26 | 则称正、反变换核是可分离的。进一步,如果$g_1$和$g_2$,$h_1$和$h_2$在函数形式上一样,则称该变换核是对称的。 27 | 28 | 二维傅立叶变换对是式(2-36)和式(2-37)的一个特殊情况, 它们的核为 29 | $$ 30 | g(x, y, u, v)=e^{-j 2 \pi\left(\dfrac{u x}{M}+\dfrac{v y}{N}\right)}=e^{-j 2 \pi \dfrac{u x}{M}} \cdot e^{-j 2 \pi \dfrac{v y}{N}} \tag{2-40} 31 | $$ 32 | $$ 33 | h(x, y, u, v)=\frac{1}{M N} e^{j 2 \pi\left(\dfrac{u x}{M}+\dfrac{v y}{N}\right)}=\frac{1}{M} e^{j 2 \pi \dfrac{u x}{M}} \cdot \frac{1}{N} e^{j 2 \pi \dfrac{v y}{N}}\tag{2-41} 34 | $$ 35 | 36 | 可见,它们都是可分离的和对称的。 37 | 38 | 如前所述,二维傅立叶变换可以利用变换核的可分离性, 用两次一维变换来实现,即可先对$f(x, y)$的每一行进行一维变换得到$F(x, v)$,再沿$F(x, v)$每一列取一维变换得到变换结果$F(u, v) 39 | $。对于其他的图像变换,只要其变换核是可分离的,同样也可用两次一维变换来实现。 40 | 41 | 如果先对$f(x, y)$的每一列进行一维变换得到$F(y, u)$,再沿$F(y, u)$每一行取一维变换得到$F(u, v)$,其最终结果是一样的。该结论对反变换核也适用。 42 | 43 | ## 2.3.2 图像变换的矩阵表示 44 | 45 | 数字图像都是实数矩阵, 设$f(x, y)$为$M\times N$的图像灰度矩阵, 通常为了分析、推导方便,可将可分离变换写成矩阵的形式: 46 | $$ 47 | F=P f Q\tag{2-42} 48 | $$ 49 | 50 | $$ 51 | F=P^{-1} F Q^{-1}\tag{2-43} 52 | $$ 53 | 54 | 其中,$F$、$f$是二维$M\times N$的矩阵;$P$是$M\times M$矩阵;$Q$是$N\times N$矩阵。 55 | $$ 56 | F(u, v)=\sum_{x=0}^{M-1} \sum_{y=0}^{N-1} P(x, u) f(x, y) Q(y, v)\tag{2-44} 57 | $$ 58 | 式中,$u=0, 1, 2, …, M-1,v=0, 1, 2, …, N-1$。对二维离散傅立叶变换,则有 59 | $$ 60 | P(x, u)=g_1(x, u)=e^{-j 2 \pi u x / M}\tag{2-45} 61 | $$ 62 | 63 | $$ 64 | P(y, v)=g_2(x, v)=e^{-j 2 \pi v / N}\tag{2-46} 65 | $$ 66 | 67 | 实践中,除了DFT变换之外,还采用许多其他的正交变换。例如:离散余弦变换、沃尔什-哈达玛变换、K-L变换等,下面将对常用的变换作一简要介绍。 68 | -------------------------------------------------------------------------------- /digital-image-processing/IV/4.7 图像的伪彩色处理.md: -------------------------------------------------------------------------------- 1 | # 4.7 图像的伪彩色处理 2 | 3 | ## 4.7.1 密度分割 4 | 5 | 密度分割是伪彩色处理技术中最简单的一种。设一幅灰度图像 $f(x, y)$, 在某一个灰度级 (如 $\left.f(x, y)=L_1\right)$ 上设置一个平行于 $x y$ 平面的切割平面, 如图4-35所示。灰度图像被切割成只有两个灰度级, 对切割平面以下的 (灰度级小于 $L_1$ ) 像素分配给一种颜色 (如蓝色), 对切割平面以上的像素分配给另一种颜色 (如红色)。这样切割结果就可以将灰度图像变为只有两个颜色的伪彩色图像。 6 | 7 | 若将灰度图像级用 $M$ 个切割平面去切割。就会得到 $M+1$ 个不同灰度级的区域 $S_1, S_2, \ldots, S_{M}, S_{M+1}$ 。对这 $M+1$ 个区域中的像素人为分配给 $M+1$ 种不同颜色, 就可以得到具有 $M+1$ 种颜色的伪彩色图像, 如图4-36所示。密度分割伪彩色处理的优点是简单易行, 便于用软件或硬件实现。还可以扩大它的用途, 如计算图像中某灰度级面积等。 8 | 9 | image-20230317110351336 10 | 11 | 图4-35 密度分割示意图 12 | 13 | image-20230317110407463 14 | 15 | 图4-36 多灰度伪彩色分割示意图 16 | 17 | ## 4.7.2 灰度级彩色变换 18 | 19 | 这种伪彩色处理技术(在遥感技术中常称为假彩色合成方法),可以将灰度图像变为具有多种颜色渐变的连续彩色图像, 实际图像的连续伪彩色变换如图4-37所示。其变换过程为:将灰度图像送入具有不同变换特性的红、绿、蓝3个变换器,再将3 个变换器的不同输出分别送到彩色显像管的红、绿、蓝电子枪。 同一灰度由3个变换器对其实施不同变换, 而使3个变换器输出不同,从而在彩色显像管里合成某种色彩。可见,不同大小灰度级一定可以合成不同色彩。 20 | 21 | ![image-20230317110436524](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230317110436524.png) 22 | 23 | 图4-37 伪彩色变换 24 | 25 | 从图中可见, 若 $f(x, y)=0$, 则 $I_B(x, y)=L, I_R(x, y)=I_{G}(x, y)=0$, 从而显示蓝色。同样, 若 $f(x, y)=L / 2$, 则 $I_G(x, y)=L, I_R(x, y)=I_G(x$, $y)=0$, 从而显示绿色。若 $f(x, y)=L$, 则 $I_R(x, y)=L, I_B(x, y)=I_G(x$, $y)=0$, 从而显示红色。 26 | 因此不难理解, 若灰度图像 $f(x, y)$ 灰度级在 $0 \sim L$ 之间变化, $I_R 、 I_B 、 I_G$ 会有不同输出, 从而合成不同的彩色图像。 27 | 28 | ## 4.7.3 滤波法 29 | 30 | 这是一种在频率域进行伪彩色处理的技术,与上面不同的是输出图像的伪彩色与图像的灰度级无关, 而是取决于图像中不同空间频率域成分。如, 为了突出图像中高频成分(图像细节)将其变为红色,只要将红色通道滤波器设计成高通特性即可。而且可以结合其他处理方法,在附加处理中实施(如直方图修正等),使其彩色对比度更强。如果要抑制图像中某种频率成分,可以设计一个带阻滤波器。其过程如图4-38所示,从3个不同频率的滤波器输出的信号再经过傅立叶反变换,可以对其做进一步的处理,如直方图均衡化。最后把它们作为三基色分别加到彩色显像管的红、绿、蓝显示通道,从而实现频率域的伪彩色处理。 31 | 32 | image-20230425192923253 33 | 34 | 图4-38 频率域伪彩色增强处理 -------------------------------------------------------------------------------- /digital-image-processing/III/3.2 Huffman编码.md: -------------------------------------------------------------------------------- 1 | # 3.2 Huffman 编码(熵编码) 2 | 3 | 图象熵: 4 | 图像灰度集合为 $\left(x_1, x_2, \ldots, x_{M}\right)$, , 对应的概率 $P_1$, $P_2, \ldots, \mathbf{P}_{M}$ 5 | 则图象熵: $\quad H=-\sum_{k=1}^M P_k \log P_k$ 6 | 平均码长: 7 | 设 $\beta_{k}$ 为图像第 $k$ 个码长 $C_{k}$ 的长度, 对应的概率为 $P_{k}$, 则该图象所赋予的码长的平均长度为: 8 | $$ 9 | R=\sum_{k=1}^M \beta_k P_k 10 | $$ 11 | 编码效率 12 | $$ 13 | \eta=\frac{H}{R} 14 | $$ 15 | 变长最佳编码定理 16 | 在变长编码中, 对图像中出现频度大的像素值赋予短码字, 对出现频度小的像数值赋予长码字。 如果严格按照所对应符号出现概率大小逆序排列, 则编码结果平均码长一定小于任何其它排列方式。 17 | Huffman 编码 18 | 根据变长最佳编码定理, 应用Huffman算法的一种编码方法。 19 | 20 | 举例: 21 | $$ 22 | \frac{\text { aaaa }}{4} \frac{bbb}{3} \frac{cc}{2} \frac{d}{1} \frac{\text { eeeee }}{5} \frac{\text { fffffff }}{7} \text { (共22*8=176 bits) } 23 | $$ 24 | 编码: $f=0 \quad e=10 \quad a=110 \quad ~b=1111 \quad c=11100 \quad ~d=11101$ 25 | 26 | 11011011011011111111111111100111001110110101010100000000 27 | (共 $7 * 1+5 * 2+4 * 3+3 * 4+2 * 5+1 * 5=56$ bits) 28 | 29 | Huffman 编码步骤: 30 | 1、先将图象灰度级按出现的概率由大到小顺序排列; 31 | 2、将最小两个概率相加, 形成一个新的概率集合, 再按第 (1) 步方法重排, 如此重复进行直到只有两个概率为止; 32 | 3、分配码长。码长分配从最后一步开始反向进行, 对最后两个概率一个赋予“0”, 一个赋予“1” 33 | 34 | ![image-20230419195748059](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419195748059.png) 35 | 36 | 整理: 37 | 38 | ![image-20230419195814242](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419195814242.png) 39 | 40 | f=01 e=11 a=10 b=001 c=0001 d=0000 41 | $$ 42 | \frac{\text { aaaa }}{4} \frac{bbb}{3} \frac{cc}{2} \frac{d}{1} \frac{\text { eeeee }}{5} \frac{\text { fffffff }}{7} \text { (共22*8=176 bits) } 43 | $$ 44 | 经过Huffman编码之后的数据为: 45 | 46 | 1010101010001001001000100010000111111111101010101010101 47 | 48 | (共 $7 * 2+5 * 2+4 * 2+3 * 3+2 * 4+1 * 4=53$ bits) 49 | 比前面我们给出的编码得到的56bits的数据量还小 50 | 51 | Huffman编码在图像压缩中的实现 52 | 我们知道, 对一幅图像进行编码时, 如果图像的大小大于 256 时, 这幅图像的不同的码字就有可能是很大, 例如极限为 256 个不同的码字。 53 | 对整幅图直接进行Huffman编码时, 小分布的灰度值, 就有可能具有很长的编码。 54 | 如: 100位以上, 这样不但达不到压缩的效果反而会使数据量加大, 应该如何处理? 55 | 56 | 常用的且有效的方法是: 57 | 将图像分割成若干的小块, 对每块进行独立的Huffman编码。例如: 分成$8\times 8$的子块, 就可以大大降低不同灰度值的个数(最多是64而不是256)。 -------------------------------------------------------------------------------- /digital-image-processing/III/3.9 混合编码.md: -------------------------------------------------------------------------------- 1 | # 3.9 混合编码 2 | 3 | 混合编码实现的可能性及有效性: 4 | 5 | 回顾一下讲过的几个内容的特点 6 | 1. 行程编码:擅长于重复数字的压缩。 7 | 2. Huffman编码:擅长于像素个数的不同编码。 8 | 4. DCT变换:擅长将高频部分分离出来。 9 | 10 | 例: 11 | $$ 12 | \frac{aaaa}{4}\frac{bbb}{3}\frac{cc}{2}\frac{d}{1}\frac{eeeee}{5}\frac{fffffff}{7} 13 | $$ 14 | 行程编码: 15 | $$ 16 | 4a3b2c1d5e7f \\ 17 | $$ 18 | 共$6\times(8+3)= 66Bits$ 19 | 20 | Huffman编码: 21 | $$ 22 | f=01\quad e=11 \quad a=10 \quad b=001\quad c=0001\quad d=0000\\ 23 | 24 | $$ 25 | 编码为 26 | $$ 27 | 1010101010001001001000100010000111111111101010101010101 28 | $$ 29 | 共$7\times2+5\times2+4\times2+3\times3+2\times4+1\times4=53 bits$ 30 | 31 | Hufman与行程编码混合: 32 | $$ 33 | 41030012000110000511701 34 | $$ 35 | 共:$3+2+3+3+3+4+3+4+3+2+3+2=35 bits$ 36 | 37 | ## 图像压缩的实例 38 | 39 | 一: 40 | 41 | 一次小波变换+DCT变换.行程编码+Huffman编码 42 | 43 | 二: 44 | 45 | 一次小波变换+差值编码+变字长行程编码+Huffman编码 46 | 47 | ### 算法 1 48 | 49 | | 原图 | 复原图 | 50 | | ------------------------------------------------------------ | ------------------------------------------------------------ | 51 | | image-20230419202532342 | image-20230419202544110 | 52 | 53 | 信噪比:66.02 54 | 55 | 压缩比:11.83:1 56 | 57 | ### 算法 2 58 | 59 | | 原图 | 复原图 | 60 | | ------------------------------------------------------------ | ------------------------------------------------------------ | 61 | | image-20230419202532342 | image-20230419202635737 | 62 | 63 | 信噪比:64.55 64 | 65 | 压缩比:26.50:1 -------------------------------------------------------------------------------- /digital-image-processing/VII/7.4 Hough 变换.md: -------------------------------------------------------------------------------- 1 | # 7.4 Hough 变换 2 | 3 | 对于图象中某些符合参数模型的主导特征, 如直线、圆、椭圆等, 可以通过对其参数进行聚类的方法,抽取相应的特征。 4 | 5 | Hough变换[Hough,1962]是一种基于图像全局分割结果的边缘连接技术, 它抗干扰能力强, 能检测出任意形状的曲线, 即使线上有许多的断裂, 因此在图像分析的预处理中获得广泛应用。 6 | 7 | 1 ) 抽取线条特征 8 | 9 | 直线在极坐标系下具有如下的参数方程形式: 10 | 11 | $$ 12 | \rho=x \cos \theta+y \sin \theta \quad(7.2) 13 | $$ 14 | 15 | 这表明图像空间的一点(x,y)对应于 $(\rho, \theta)$ 空间的一条正弦曲线,其相位和幅值由 $\mathbf{x} 、 \mathbf{y}$ 决定。 16 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-27.jpg?height=546&width=1366&top_left_y=1002&top_left_x=525) 17 | 18 | 图 7-15 点的Hough变换的极坐标形式 19 | 20 | $(x, y)$ 空间的同一条直线上的点在 $(\rho, \theta)$ 空间的正弦曲线都会相交于点 $\left(\rho_{0}, \theta_{0}\right), \rho_{0}$ 为这条直线到原点的距离, $\theta_{0}$ 为直线的法线与轴的夹角. 21 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-28.jpg?height=526&width=1468&top_left_y=745&top_left_x=630) 22 | 23 | 图 7-16 共线点Hough变换的极坐标形式 24 | 25 | 首先将参数空间 $(\rho, \theta)$ 量化为等间隔的小区域,然后针对超过给定阈值的所有边缘点, 对于每个$(\boldsymbol{p}, \boldsymbol{\theta})$ 将其映射到的参数空间中的小区域中, 记数落到每个小区域的点数。最后, 取具有最大频度的若干小区域的参数作为线条特征的参数, 得到图象中主导性的线条特征。 26 | 27 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-29.jpg?height=497&width=641&top_left_y=1142&top_left_x=1044) 28 | 29 | ### 算法 30 | 31 | 1) 将 $(\rho, \theta)$ 空间量化, 得到二维矩阵 $M(\rho, \theta)$, $M(\rho, \theta)$ 是一个累加器, 初始值为 $0, M(\rho, \theta)=0$ 。 32 | 33 | 2 ) 对边界上的每一个点 $\left(x_{i}, y_{i}\right)$, 将 $\theta$ 的所有量化值代入式 ( 7-2), 计算相应的 $\rho$, 并且将累加器加1, $M(\rho, \theta)=M(\rho, \theta)+1$ 。 34 | 35 | 3) 将全部 $\left(x_{i}, y_{i}\right)$ 处理后, 分析 $M(\rho, \theta)$, 如果 $M(\rho, \theta) \geq T$, 就认为存在一条有意义的线段, 是该线段的拟合参数。 $T$ 是一个非负整数, 由图像中景物的先验知识决定。 36 | 37 | 4) 由 $(\rho, \theta)$ 和 $\left(x_{i}, y_{i}\right)$ 共同确定图像中的线段, 并将断裂部分连接。 38 | 39 | 2 )抽取圆特征$$ 40 | (x-a)^{2}+(y-b)^{2}=r^{2} 41 | 42 | 43 | 1. 固定r, 首先将参数空间 $(a, b)$ 量化为等间隔的小区域, 然后针对超过给定阈值的所有边缘点, 对于每个(a,b)将其映射到的参数空间中的小区域中, 记数落到每个小区域的点数。最后, 取具有最大频度的若干小区域的参数作为圆特征的参数; 44 | 45 | 2 . $r$ 取不同值, 重复第一步; 最大频度对应参数即为图象中圆参数。} 46 | 47 | 48 | 49 | 图像分割小结 50 | 51 | 1、图像分割是将一幅数字图像划分为不交叠的、连通的像素集的过程, 其中一个对应于背景, 其他的则对应于图像中的各个物体。 52 | 53 | 2、图像分割可以通过为物体指定其像素或找出物体之间的(或物体和背景之间的)边界的方法来实现。 3 、灰度级阈值处理是一种总能产生闭合的连通边界的简单分割技术。 54 | 55 | 4 、在分割之前进行背景的平滑和噪声消除, 常常能改善分割的性能。 5 、阈值的大小应当根据图像的内容变化,除非背景灰度级和物体的对比度相对恒定。 56 | 57 | 6、具有简单物体以及与背景对比度明显的图像, 将阈值置于双峰直方图的低䏌可使物体面积对阈值变化的敏感度最小。 58 | 59 | 7、物体分割可以通过在梯度图像中进行边界跟踪或阈值处理来实现。 60 | 61 | 8 、对一幅图像的分割可以用隶属关系图、边界链码、或线段编码来实现。 -------------------------------------------------------------------------------- /digital-image-processing/III/3.10 预测编码.md: -------------------------------------------------------------------------------- 1 | # 3.10预测编码 2 | 3 | 利用图象局部邻域象素的可预测性来进行圧缩. 4 | 设: $f(n, m)$ 为 $(n, m)$ 点的灰度值; $f(n-i, m-j),(i, j) \in A$, 为邻域A内某点的灰度值,则: 5 | $$ 6 | \hat{f}(n, m)=L(f(n-i, m-j),(i, j) \in A,(i, j) \neq(0,0) 7 | $$ 8 | L为预测值,通常取为囱口 $A$ 内象素点恢度值的线性函数.如图所示, 即由㳡去的 $f_r(n-i, m-j)$ 来预测 $f(n, m)$ : 9 | 10 | ![image-20230419202809170](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419202809170.png) 11 | $$ 12 | \hat{f}(n, m)=L\left(f_r(n-i, m-j)\right) \quad(i, j) \in A 13 | $$ 14 | 因此可以建立一种递归预测编码技术,对应的误差为: 15 | $$ 16 | \begin{aligned} 17 | & e_q(n, m)=f(n, m)-\hat{f}(n, m) \\ 18 | & f(n, m)=L\left(f_r(n-i, m-j)\right)+e_q(n, m) 19 | \end{aligned} 20 | $$ 21 | 即 $\mathbf{f}(\mathbf{n}, \mathbf{m})$ 由 $\mathbf{e}(\mathbf{n}, \mathbf{m})$ 代替, 如果预测 $\hat{f}(n, m)$ 效果好, 则误差项的动态范围很小, 可以有较小的码字来编码,这样便得到显著的压缩效果. 22 | 23 | 为了重建图象,需要传输预测系数和误差编码,这种编码方式称为预测脉冲编码调制(DPCM),如图: 24 | 25 | ![image-20230419202848913](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419202848913.png) 26 | 27 | 假设图象的某一行 $f(n, m)(f(n, m)$ 记为 $f(m))$ 可用一平稳自相关AR过程表示: 28 | $$ 29 | f(m)=\sum_{k=1}^p a(k) f(m-k)+e(m) \quad E\left[e^2(m)\right]=\sigma^2 30 | $$ 31 | 其中e $(m)$ 为一个与 $f(m)$ 不相关的高斯白噪声, 则预测器: 32 | $$ 33 | \hat{f}(m)=\sum_{k=1}^P a(k) \hat{f}_r(m-k) 34 | $$ 35 | 预测器系数构成一向量 $a=(a(1), a(2) \ldots, a(P))^{\top}, \quad$ 预测窗口A内重建象素 $\left\{f_r(m-1), \ldots, f_r(m-P)\right.$, 量化误差: 36 | $$ 37 | e_q(m)=Q(e(m))=Q[f(m)-\hat{f}(m)] 38 | $$ 39 | 重建图象行: $f_r(m)=\sum_{k=1}^p a(k) f_r(m-k)+e_q(m)$ 40 | 41 | 预测系数通过下式求解 42 | $$ 43 | \left[\begin{array}{cccc} 44 | R(0) & R(1) & \cdots & R(P-1) \\ 45 | R(1) & R(2) & \cdots & R(P-2) \\ 46 | \vdots & \vdots & \vdots & \vdots \\ 47 | R(P-1) & R(P-2) & \cdots & R(0) 48 | \end{array}\right]\left[\begin{array}{c} 49 | a(1) \\ 50 | a(2) \\ 51 | \vdots \\ 52 | a(P) 53 | \end{array}\right]=\left[\begin{array}{c} 54 | R(1) \\ 55 | R(2) \\ 56 | \vdots \\ 57 | R(P) 58 | \end{array}\right] 59 | $$ 60 | 61 | ## 预测编码(最佳线性预测) 62 | 63 | 二维模型: 64 | $$ 65 | \hat{f}(n, m)=\sum \sum_{(i j) \in A}^P a(i, j) \hat{f}_r(n-i, m-j) 66 | $$ 67 | 通过求解E最小: 68 | $$ 69 | \left.\left.E\left[\mid f(n, m)-\sum \sum_{(i, j) \in A} a(i, j) f(n-i), m-j\right)\right|^2\right] 70 | $$ 71 | 得: $\left.\quad R(k, l)=\sum \sum_{(i, j) \in A} a(i, j) R(n-i), m-j\right)$ 72 | 求解上式得到 $a(i, j)$, 再得到: 73 | $$ 74 | e(n, m)=f(n, m)-\hat{f}(n, m) 75 | $$ 76 | 接收端得: $f_r(n, m)=\sum \sum_{(i j) \in A}^P a(i, j) \hat{f}_r(n-i, m-j)+e_q(n, m)$ -------------------------------------------------------------------------------- /digital-image-processing/III/3.6 算术编码.md: -------------------------------------------------------------------------------- 1 | # 3.6 算术编码 2 | 3 | ​ 算术编码有两种模式:一种是基于信源概率统计特性的固定编码模式,另一种是针对未知信源概率模型的自适应模式。自适应模式中各个符号的概率初始值都相同, 它们依据出现的符号而相应地改变。只要编码器和解码器都使用相同的初始值和相同的改变值的方法,那么它们的概率模型将保持一致。上述两种形式的算术编码均可用硬件实现,其中自适应模式适用于不进行概率统计的场合。有关实验数据表明,在未知信源概率分布的情况下, 算术编码一般要优于Huffman编码。在JPEG扩展系统中,就用算术编码取代了哈夫曼编码。 4 | 5 | 下面结合一个实例来阐述固定模式的算术编码的具体方法。 设一待编码的数据序列 (即信源) 为 “ dacab", 信源中各符号出现的概率依次为 $P(a)=0.4, P(b)=0.2, P(c)=0.2, \quad P(d)=0.2$ 。 6 | 首先, 数据序列中的各数据符号在区间 $[0,1]$ 内的间隔 (赋值范围)设定为 $a=[0,0.4), b=[0.4,0.6), c=[0.6,0.8)$ , $d=[0.8,1.0)$ 7 | 为便于讨论, 再给出一组关系式: 8 | $$ 9 | \left\{\begin{array}{l} 10 | \operatorname{Start}_{N}=\operatorname{Start}_{B}+\operatorname{Left}_{C} \times L \\ 11 | \operatorname{End}_{N}=\operatorname{Start}_{B}+\operatorname{Right}_{C} \times L 12 | \end{array}\right. 13 | $$ 14 | 式中, $\operatorname{Start}_{\mathbb{N}} 、 End_{\mathbb{N}}$ 分别表示新间隔 (或称之为区间)的起始位置和结束位置, Start ${ }_{B}$ 表示前一间隔的起始位置, $L$ 为前一间隔的长度, Left $_C 、$ Right $_C$ 分别表示当前编码符号的初始区间的左端和右端。 15 | 第一个被压缩的符号为 “ $d$ ",其初始间隔为 $[0.8,1.0)$; 16 | 第二个被压缩的符号为 “ $a$ ", 由于前面的符号 “ $d^{\prime \prime}$ 的取值区间被限制在 $[0.8,1.0$ )范围内, 所以 “ $a$ ”的取值范围应在前一符号间隔 $[0.8,1.0)$ 的 $[0,0.4)$ 子区间内, 根据上式可知 17 | $$ 18 | \begin{aligned} 19 | & \text { Start }_{N}=0.8+0 \times(1.0-0.8)=0.8 \\ 20 | & \text { End }_{N}=0.8+0.4 \times(1.0-0.8)=0.88 21 | \end{aligned} 22 | $$ 23 | 即 “ $a$ ”的实际编码区间在 $[0.8,0.88)$ 之间。 24 | 25 | 第三个被压缩的符号为 “ $c^{\prime \prime}$, 其编码取值范围应在 $[0.8$, $0.88)$ 区间的 $[0.6,0.8)$ 的子区间内, 据上式可知 26 | $$ 27 | \begin{aligned} 28 | & \text { Start }_N=0.8+0.6 \times(0.88-0.8)=0.848 \\ 29 | & \text { End }_N=0.8+0.8 \times(0.88-0.8)=0.864 30 | \end{aligned} 31 | $$ 32 | 第四个被压缩的符号为 “ $a$ ”, 同理, 根据上式可知 33 | $$ 34 | \begin{aligned} 35 | & \operatorname{Start}_{N}=0.848+0 \times(0.864-0.848)=0.848 \\ 36 | & \operatorname{End}_{N}=0.848+0.4 \times(0.864-0.848)=0.8544 37 | \end{aligned} 38 | $$ 39 | 第五个被压缩的符号为 “ $b$ ”, 同理, 根据上式可知 40 | $$ 41 | \begin{aligned} 42 | & \text { Start }_{N}=0.848+0.4 \times(0.8544-0.848)=0.84856 \\ 43 | & \text { End }_{N}=0.848+0.6 \times(0.8544-0.848)=0.85144 44 | \end{aligned} 45 | $$ 46 | 至此, 数据序列 “dacab"已被描述为一个实数区间 $[0.85056$, $0.85184]$, 或者说在此区间内的任一实数值都惟一对应该数据序列。这样, 就可以用一个实数表示这一数据序列。我们把区间 [0. 850 56,0.851 84] 用二进制形式表示为 $[0.110110011011$, $0.110110100001]$ 。 47 | 48 | 从这个区间可以看出,0.1101101位于这个区间内并且其编码最短, 故把其作为数据序列“dacab”的编码输出。考虑到算术编码中任一数据序列的编码都含有“0.”,所以在编码时,可以不考虑“0.”,于是把1101101作为本例中的数据序列的算术编码。由此可见, 数据序列“dacab”用7比特的二进制代码就可以表示, 平均码长为1.4比特/字符。 49 | 50 | ​ 解码是编码的逆过程,根据编码时的概率分配表和压缩后数据代码所在的范围,确定代码所对应的每一个数据符号。由此可见,算术编码的实现方法要比哈夫曼编码复杂一些。 -------------------------------------------------------------------------------- /digital-image-processing/1 概论.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 第一章 概论 4 | 5 | ## 1.1.什么是数字图象 6 | 7 | ​ 数字图象是指由被称作象素的小块区域组成的二维矩阵。 8 | ​ 对于单色即灰度图象而言,每个象素的亮度用一个数值来表示,通常数值范围在0到255之间,即可用一个字节来表示,0表示黑、255表示白,而其它表示灰度。 9 | 10 | ​ 彩色图象可以用红、绿、蓝三元组的二维矩阵来表示。通常,三元组的每个数值也是在0到255之间,0表示相应的基色在该象素中没有,而255则代表相应的基色在该象素中取得最大值,这种情况下每个象素可用三个字节来表示。 11 | 12 | ## 1.2.数字图象处理系统的基本组成结构 13 | 14 | ```mermaid 15 | graph LR; 16 | 图像数字化设备--输入图像-->图像处理计算机--输出图像-->图像输出设备 17 | ``` 18 | 19 | - 图象数字化设备:扫描仪、数码相机、 摄象机与图象采集卡等 20 | 21 | - 图象处理计算机:PC、工作站等 22 | 23 | - 图象输出设备:打印机等 24 | 25 | ## 1.3.数字图象发展 26 | 27 | > 20世纪20年代,通过海底电缆从英国伦敦向美国纽约采用数字压缩技术传输了第一幅数字照片,耗时3小时. 28 | > 1964年美国喷气式推进实验室处理了太空船“徘徊者七号”发回的月球照片,标志着第三代计算机问世后数字图像处理开始得到普遍应用. 29 | > CT的发明,应用及获得诺贝尔奖. 30 | > 2003年诺贝尔奖颁发给了核磁共振影像技术. 31 | > 32 | > 本世纪20年代,纽约-伦敦海底电缆传输数字化的新闻图片。传递时间从一个多星期减少到3个小时。 33 | > 34 | > 五十年代中期在太空计划的推动下开始这项技术的研究。重要标志是1964年美国喷气推进实验室(JPL)正式使用数字计算机对“徘徊者7号”太空船送回的四千多张月球照片进行了处理。 35 | > 36 | > 60年代末,数字图象处理形成一个比较完整的理论与技术体系,从而构成了一门独立的技术 37 | > 70年代,CT的发明,血球自动分类仪的商业化 38 | > CT发明获得1979年诺贝尔医学奖。X射线1901年物理学奖。 39 | > 70年代以来迅猛发展。广泛应用于太空探索,遥感应用,生物医学工程工业应用,军事应用等方面。 40 | 41 | ## 1.4.图象处理技术分类 42 | 43 | 模拟图象处理 44 | 45 | 数字图象处理 46 | 47 | ## 1.5. 数字图象处理特点 48 | 49 | 图象信息大 50 | 51 | 图象处理技术综合性强 52 | 53 | 图象信息理论与通信理论密切相关 54 | 55 | ## 1.6. 数字图象处理的应用 56 | 57 | 图象处理的重要应用包括: 58 | 59 | - 遥感 60 | - 视觉监视、保安 61 | - 工业检测与测量 62 | - 宇宙探险、军事侦察、高精度制导 63 | - 医疗诊断 64 | - 通讯 65 | 66 | ## 1.7.数字图像处理的主要研究内容 67 | 68 | - 按研究对象 69 | - 按应用方式 70 | - 按理论方法 71 | 72 | ### 按研究对象 73 | 74 | - 灰度图像 75 | - 二值图像 76 | - 彩色及多光谱图像 77 | - 图像序列分析 78 | - 双目图像分析 79 | 80 | ### 按应用方式 81 | 82 | 图像获取: 83 | 84 | - 摄取图像 85 | - 光电转换 86 | - 数字化 87 | 88 | 图像的数字化:如何将一幅光学图像表示成一组数字既不失真又便于计算机分析处理。主要包括的是图像的采样与量化。 89 | 90 | 图像存储: 91 | 92 | - 数据压缩 93 | - 图像格式 94 | - 图像数据库 95 | 96 | 图像的传输: 97 | 98 | - 内部传输 99 | - 外部传输 100 | 101 | 图像的恢复: 102 | 103 | 把退化、模糊了的图像复原。模糊的原因有许多种,最常见的有运动模糊,散焦模糊等等。 104 | 105 | 图像的增强: 106 | 107 | 加强图像的有用信息,消弱干扰和噪声。 108 | 109 | 图像的重建: 110 | 111 | 由二维图像重建三维图像。 112 | 113 | 图像的识别: 114 | 115 | 略 116 | 117 | 图像的理解: 118 | 119 | 略 120 | 121 | 图像分割与特征提取: 122 | 123 | 图像分割是指将一幅图像的区域根据分析对象进行分割。 124 | 125 | 图像的特征提取包括了形状特征、纹理特征、颜色特征等等。 126 | 127 | #### 图像隐藏 128 | 129 | 是指媒体信息的相互隐藏。 130 | - 数字水印 131 | - 图像的信息伪装 132 | 133 | #### 虚拟现实 134 | 135 | ### 按理论方法 136 | 137 | - 点处理,代数处理,几何处理。 138 | - 变换域处理与分析(傅立叶变换及滤波器设计分析) 139 | - 随机统计等现代信号处理方法。 140 | - 小波形态学,分形等先进数学工具。 141 | - 人工智能方法:模式识别,符号逻辑,人工神经网络。 142 | 143 | ## 1.8.数字图像处理方法 144 | 145 | - 空域法 146 | - 邻域处理法 147 | - 点处理法 148 | - 变换域法 149 | 150 | ## 1.9.几个当今热点的研究方向 151 | 152 | - 因特网上的图像检索 153 | - 图像在网上的传输 154 | - 图像的安全技术 155 | - 图像的处理技术 156 | - 图像的自动识别 157 | - 图像作为检测手段的一种 158 | - 其它视频方面的研究与需求 -------------------------------------------------------------------------------- /digital-image-processing/I/1 概论.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 第一章 概论 4 | 5 | ## 1.1.什么是数字图象 6 | 7 | ​ 数字图象是指由被称作象素的小块区域组成的二维矩阵。 8 | ​ 对于单色即灰度图象而言,每个象素的亮度用一个数值来表示,通常数值范围在0到255之间,即可用一个字节来表示,0表示黑、255表示白,而其它表示灰度。 9 | 10 | ​ 彩色图象可以用红、绿、蓝三元组的二维矩阵来表示。通常,三元组的每个数值也是在0到255之间,0表示相应的基色在该象素中没有,而255则代表相应的基色在该象素中取得最大值,这种情况下每个象素可用三个字节来表示。 11 | 12 | ## 1.2.数字图象处理系统的基本组成结构 13 | 14 | ```mermaid 15 | graph LR; 16 | 图像数字化设备--输入图像-->图像处理计算机--输出图像-->图像输出设备 17 | ``` 18 | 19 | - 图象数字化设备:扫描仪、数码相机、 摄象机与图象采集卡等 20 | 21 | - 图象处理计算机:PC、工作站等 22 | 23 | - 图象输出设备:打印机等 24 | 25 | ## 1.3.数字图象发展 26 | 27 | > 20世纪20年代,通过海底电缆从英国伦敦向美国纽约采用数字压缩技术传输了第一幅数字照片,耗时3小时. 28 | > 1964年美国喷气式推进实验室处理了太空船“徘徊者七号”发回的月球照片,标志着第三代计算机问世后数字图像处理开始得到普遍应用. 29 | > CT的发明,应用及获得诺贝尔奖. 30 | > 2003年诺贝尔奖颁发给了核磁共振影像技术. 31 | > 32 | > 本世纪20年代,纽约-伦敦海底电缆传输数字化的新闻图片。传递时间从一个多星期减少到3个小时。 33 | > 34 | > 五十年代中期在太空计划的推动下开始这项技术的研究。重要标志是1964年美国喷气推进实验室(JPL)正式使用数字计算机对“徘徊者7号”太空船送回的四千多张月球照片进行了处理。 35 | > 36 | > 60年代末,数字图象处理形成一个比较完整的理论与技术体系,从而构成了一门独立的技术 37 | > 70年代,CT的发明,血球自动分类仪的商业化 38 | > CT发明获得1979年诺贝尔医学奖。X射线1901年物理学奖。 39 | > 70年代以来迅猛发展。广泛应用于太空探索,遥感应用,生物医学工程工业应用,军事应用等方面。 40 | 41 | ## 1.4.图象处理技术分类 42 | 43 | 模拟图象处理 44 | 45 | 数字图象处理 46 | 47 | ## 1.5. 数字图象处理特点 48 | 49 | 图象信息大 50 | 51 | 图象处理技术综合性强 52 | 53 | 图象信息理论与通信理论密切相关 54 | 55 | ## 1.6. 数字图象处理的应用 56 | 57 | 图象处理的重要应用包括: 58 | 59 | - 遥感 60 | - 视觉监视、保安 61 | - 工业检测与测量 62 | - 宇宙探险、军事侦察、高精度制导 63 | - 医疗诊断 64 | - 通讯 65 | 66 | ## 1.7.数字图像处理的主要研究内容 67 | 68 | - 按研究对象 69 | - 按应用方式 70 | - 按理论方法 71 | 72 | ### 按研究对象 73 | 74 | - 灰度图像 75 | - 二值图像 76 | - 彩色及多光谱图像 77 | - 图像序列分析 78 | - 双目图像分析 79 | 80 | ### 按应用方式 81 | 82 | 图像获取: 83 | 84 | - 摄取图像 85 | - 光电转换 86 | - 数字化 87 | 88 | 图像的数字化:如何将一幅光学图像表示成一组数字既不失真又便于计算机分析处理。主要包括的是图像的采样与量化。 89 | 90 | 图像存储: 91 | 92 | - 数据压缩 93 | - 图像格式 94 | - 图像数据库 95 | 96 | 图像的传输: 97 | 98 | - 内部传输 99 | - 外部传输 100 | 101 | 图像的恢复: 102 | 103 | 把退化、模糊了的图像复原。模糊的原因有许多种,最常见的有运动模糊,散焦模糊等等。 104 | 105 | 图像的增强: 106 | 107 | 加强图像的有用信息,消弱干扰和噪声。 108 | 109 | 图像的重建: 110 | 111 | 由二维图像重建三维图像。 112 | 113 | 图像的识别: 114 | 115 | 略 116 | 117 | 图像的理解: 118 | 119 | 略 120 | 121 | 图像分割与特征提取: 122 | 123 | 图像分割是指将一幅图像的区域根据分析对象进行分割。 124 | 125 | 图像的特征提取包括了形状特征、纹理特征、颜色特征等等。 126 | 127 | #### 图像隐藏 128 | 129 | 是指媒体信息的相互隐藏。 130 | 131 | - 数字水印 132 | - 图像的信息伪装 133 | 134 | #### 虚拟现实 135 | 136 | ### 按理论方法 137 | 138 | - 点处理,代数处理,几何处理。 139 | - 变换域处理与分析(傅立叶变换及滤波器设计分析) 140 | - 随机统计等现代信号处理方法。 141 | - 小波形态学,分形等先进数学工具。 142 | - 人工智能方法:模式识别,符号逻辑,人工神经网络。 143 | 144 | ## 1.8.数字图像处理方法 145 | 146 | - 空域法 147 | - 邻域处理法 148 | - 点处理法 149 | - 变换域法 150 | 151 | ## 1.9.几个当今热点的研究方向 152 | 153 | - 因特网上的图像检索 154 | - 图像在网上的传输 155 | - 图像的安全技术 156 | - 图像的处理技术 157 | - 图像的自动识别 158 | - 图像作为检测手段的一种 159 | - 其它视频方面的研究与需求 -------------------------------------------------------------------------------- /digital-image-processing/V/5.4 最小二乘滤波(维纳滤波,重点).md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 5.4 最小二乘方滤波(维纳滤波) 4 | 5 | **重点** 6 | 7 | 知道图像,知道有关分布特征 8 | 9 | 1.最小二乘方滤波 10 | 设原始图像, 退化图像和噪声分别为 $f(x, y), g(x, y)$ 和 $n(x, y)$, 则 : 11 | 12 | $$ 13 | g(x, y)=H[f(x, y)]=H\left[\int_{-\infty}^{+\infty} \int_{-\infty}^{+\infty} f(\alpha, \beta) \delta(x-\alpha, y-\beta) d \alpha d \beta\right]+n(x, y)$ 在给定的 $g(x, y)$ 时, 找出 $f(x, y)$ 的估计 $f(x, y) 14 | $$ 15 | 使: 16 | $$ 17 | e^2=E\left\{[f(x, y)-\hat{f}(x, y)]^2\right\} 18 | $$ 19 | 最小. 20 | 21 | 设 22 | $$ 23 | \quad \hat{f}(x, y)=\iint m(x, y, \alpha, \beta) g(\alpha, \beta) d \alpha d \beta 24 | $$ 25 | 2. 求解 26 | 如果 $f(x, y), g(x, y)$ 和 $n(x, y)$ 是均匀随机场, 则 : 27 | $$ 28 | \hat{f}(x, y)=\iint m(x-\alpha, y-\beta) g(\alpha, \beta) d \alpha d \beta 29 | $$ 30 | 因此图像恢复就是确定m $m, y)$. 通过求解得: 31 | $$ 32 | \begin{aligned} 33 | M(u, v) & =\left[\frac{H^*(u, v)}{|H(u, v)|^2+\left[S_n(u, v) / S_f(u, v)\right]}\right] \\ 34 | & =\left[\frac{1}{H(u, v)} \cdot \frac{|H(u, v)|^2}{\left|H(u, v)^2\right|+\left[S_n(u, v) / S_f(u, v)\right]}\right] 35 | \end{aligned} 36 | $$ 37 | $H(u, v)$ 是的h $(x, y)$ 付里叶变换. 38 | $S_f, S_n$ 分别是 $f(x, y), n(x, y)$ 的谱密度 39 | 40 | 于是: 41 | $$ 42 | \begin{aligned} 43 | \hat{F}(u, v) & =\left[\frac{H^*(u, v)}{|H(u, v)|^2+\left[S_n(u, v) / S_f(u, v)\right]}\right] G(u, v) \\ 44 | & =\left[\frac{1}{H(u, v)} \cdot \frac{|H(u, v)|^2}{\left|H(u, v)^2\right|+\left[S_n(u, v) / S_f(u, v)\right]}\right] G(u, v) 45 | \end{aligned}\tag{5-32} 46 | $$ 47 | 式中, 48 | $$ 49 | u, v=0,1,2, \ldots, N-1,|H(u, v)|^2=H^*(u, v) H(u, v) 50 | $$ 51 | 52 | 3. 讨论 53 | - $S_n=0$ 时, 是理想的逆滤波器 54 | -若随机过程的统计特性不知道, 可采用: 55 | $$ 56 | M(u, v)=\frac{1}{H(u, v)} \frac{|H(u, v)|^2}{|H(u, v)|^2+\Gamma} 57 | $$ 58 | 式中 $\Gamma$ 是噪声对信号的功率密度比. 59 | 60 | - 维纳滤波器是假设线性系统, 实际上图像的记录和评价图像的视觉系统都是非线性系统. 61 | - 维纳滤波器是根据最小均方差设计的,这个准则不见得与人的视觉判决准则相符. 62 | - 维纳滤波器是基于平稳随机过程的模型,实际图像不一定符合这一条件. 63 | 64 | ## 几种最小二乘方滤波器 65 | 66 | (仅供了解) 67 | 68 | 1.图像功率谱滤波器 69 | $$ 70 | H_{R}(u, v)=\left[\frac{W_{FI}(u, v)}{\left|H_{D}(u, v)\right|^2 W_{F 1}(u, v)+W_{N}(u, v)}\right]^{\frac{1}{2}} 71 | $$ 72 | 式中 $H_{D}(u, v)$ 是图像退化的传递函数。 $W_{F 1}(u, v)$ 代表滤波器输出功率频谱, 73 | $$ 74 | W_{FI}(u, v)=\left|H_{D}(u, v)\right|^2 W_{FO}(u, v) 75 | $$ 76 | 式中 $W_{FO}(u, v)$ 代表观测的功率频谱。它与理想图像的功率频谱的关系是 77 | $$ 78 | W_{FO}(u, v)=\left|H_{D}(u, v)\right|^2 \cdot W_{FI}(u, v)+W_{N}(u, v) 79 | $$ 80 | 式中 $W_{N}(u, v)$ 是噪声功率频谱。 81 | 82 | 2.几何平均滤波器. 83 | 84 | 几何平均滤波器的传递函数由下式表示: 85 | $$ 86 | H_{R}(u, v)=\left[H_{D}(u, v)\right]^{-s}\left[\frac{H_{D}^*(u, v) W_{FI}(u, v)}{\left|H_{D}(u, v)\right|^2 W_{FI}(u, v)+W_{N}(u, v)}\right]^{1-s} 87 | $$ 88 | S是一个参数 89 | 90 | 3.约束最小方滤波器 91 | 92 | 约束最小方滤波器的传递函数如下: 93 | $$ 94 | H_{\mathrm{R}}(u, v)=\frac{H_{\mathrm{D}}^*(u, v)}{\left|H_{\mathrm{D}}(u, v)\right|^2+r|L(u, v)|^2} 95 | $$ 96 | $r$是一个参数,$L(u,v)$是一个频率参数。$r=1$为维纳滤波器 -------------------------------------------------------------------------------- /digital-image-processing/VII/7.2 边缘检测.md: -------------------------------------------------------------------------------- 1 | # 7.2 边缘检测 2 | 3 | 当物体与背景有明显对比度时,物体的边界处于图象梯度最高的点上,通过跟踪图象中具有最高梯度的点的方式获得物体的边界, 可以实现图象分割。 4 | 5 | 这种方法容易受到噪声的影响而偏离物体边界, 通常需要在跟踪前对梯度图象进行平滑等处理,再采用边界搜索跟踪算法来实现。 6 | 7 | 在Marr的视觉计算理论框架中, 抽取二维图像上的边缘、 角点、纹理等基本特征, 是整个系统框架中的第一步。这些特征所组成的图称为基元图。Yuille 等指出, 在不同 “尺度” 意义下的边缘点, 在一定条件下包含了原图像的全部信息。图5-7画出了一幅图像中的边缘点, 仅仅根据这些边缘点, 就能识别出三维物体,可见边缘点确实包含了图像中的大量信息。 8 | 9 | 10 | 11 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-07.jpg?height=1062&width=1387&top_left_y=279&top_left_x=525) 12 | 13 | 图5-7 图像中的边缘点 14 | 15 | (1) 空间曲面上的不连续点。如标为 $A$ 的边缘线, 这些边缘线为两个不同曲面的或平面的交线, 该点处物体表面的法线方向不连续, 在 $A$ 类边缘线的两边, 图像的灰度值有明显的不同。 16 | 17 | (2)B类边缘线。B类边缘线是由不同材料或相同材料不同颜色产生的。图中桌面由两种不同材料组成, 由于它们对光的反射系数不同,使 $B$ 边缘线的两侧灰度有明显不同。 18 | 19 | (3) $C$ 类边缘线。C类边缘线是物体与背景的分界线。如图中圆柱上有两条 $C$ 类边缘线, 这类边缘线一般称为外轮廓线。在 $C$ 类边缘点上, 三维物体表面的法线方向是连续的, 出现边缘点是由于从一定视角看物体时, $C$ 类边界点是物体与背景的交界处。 由于物体与背景在光照条件与材料反射系数等方面差异很大, 因此在 $C$ 类边缘两侧, 图像的灰度也有很大差异。图中标以 $C^{\prime}$ 的边缘, 即是物体与背景的交界处, 也是物体上表面法线的不连续处,但引起它两侧灰度跃变的原因是前者。 20 | 21 | (4)D边缘。D是阴影引起的边缘。由于物体表面某一部分被另一物体遮挡, 使它得不到光源的照射, 从而引起边缘点两侧灰度值有较大的差异。 22 | 23 | ## 7.2.1 边缘检测与微分运算 24 | 25 | 如前所述, 边缘点是信号 “变化剧烈” 的地方, 但这么说并不准确, 需要定义一个准确的边缘数学模型。以一维信号为例,图 7-8(a)是一种阶跃信号, 我们当然认为 $A$ 点处为边缘点。在实际情况中,物理信号不可能有理想的突变,而是如图 7-8(b) 所示的逐渐增大的信号, 对图 $7-8$ ( $b$ ) 中所示 $A 、 B 、 C$ 三点, 一般称 $B$ 点为边缘点。在图 $7-8(c)$ 和 $7-8(d)$ 中,如果台阶比较窄, 即可以认为 $B$ 点为边缘点, 也可以认为该信号有两个边缘点 $A$ 与 $C$ 。 26 | 27 | ![image-20230329165152665](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329165152665.png) 28 | 29 | 图7-8 不同的边缘信号 30 | 31 | ![image-20230329165210101](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329165210101.png) 32 | 33 | 图 7-9 图像中不同类型的边界 34 | (a)边界; 35 | (b) 线; 36 | (c)折线变化; 37 | (d)缓慢的平滑变化 38 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-13.jpg?height=976&width=1806&top_left_y=322&top_left_x=332) 39 | 40 | 图 7 -10 用Prewitt算子进行边缘检测的结果 41 | 42 | ## 5.2.2 高斯-拉普拉斯(LOG)算子 43 | 44 | 噪声点对边缘检测有较大的影响, 效果更好的边缘检测器是高斯-拉普拉斯(LOG)算子。它把高斯平滑滤波器和拉普拉斯锐化滤波器结合起来, 先平滑掉噪声, 再进行边缘检测, 所以效果更好。 45 | 46 | 常用的LOG算子是 $5 \times 5$ 的模板: 47 | 48 | $$ 49 | \left[\begin{array}{ccccc} 50 | -2 & -4 & -4 & -4 & -2 \\ 51 | -4 & 0 & 8 & 0 & -4 \\ 52 | -4 & 8 & 24^{*} & 8 & -4 \\ 53 | -4 & 0 & 8 & 0 & -4 \\ 54 | -2 & -4 & -4 & -4 & -2 55 | \end{array}\right] 56 | $$ 57 | 58 | 59 | 60 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-15.jpg?height=1008&width=1754&top_left_y=287&top_left_x=421) 61 | 62 | 图7-11 LOG算子中心点的距离与位置加权系数的关系 63 | 64 | 若将图 7 -11绕y轴作旋转一周后, LOG算子很像一顶墨西哥草帽,所以,LOG又叫墨西哥草帽滤波器。在图像边缘检测中, 还有Wallis算子、过零点检测(Marr-Hildreth算子)、Canny边缘检测方法、SUSAN(Smallest Univalue Segment Assimilating Nucleus)边缘检测等。 65 | 66 | 在边缘图象的基础上,需要通过平滑、形态学等处理去除噪声点、毛刺、空洞等不需要的部分,再通过细化、边缘连接和跟踪等方法获得物体的轮廓边界。 67 | 68 | 69 | ![](https://cdn.mathpix.com/cropped/2023_03_28_6116f4e0e226f2060611g-17.jpg?height=1006&width=1328&top_left_y=662&top_left_x=582) 70 | 71 | -------------------------------------------------------------------------------- /digital-image-processing/IV/4.3 灰度变换.md: -------------------------------------------------------------------------------- 1 | # 4.3 灰度变换 2 | 3 | ## 4.2.1 灰度线性变换 4 | 5 | 假定原图像 $f(x, y)$ 的灰度范围为 $[a, b]$, 希望变换后图像 $g(x$, $y)$ 的灰度范围扩展至 $[c, d]$, 则线性变换可表示为 6 | $$ 7 | g(x, y)=\frac{d-c}{b-a}[f(x, y)-a]+c\tag{4-12} 8 | $$ 9 | 此式用图4-12表示。若图像灰度在 $0 \sim M_f$ 范围内, 其中大部分像素的灰度级分布在区间 $[a, b]$, 很小部分的灰度级超出了此区间, 为改善增强的效果, 可令: 10 | $$ 11 | g(x, y)= \begin{cases}c & 0 \leq f(x, y) 43 | 44 | 图4-15 常见的几种非线性变换函数 45 | 46 | 式(4-16)对灰度区间$ [0, a]$和$[b, M_f]$加以压缩,对灰度区间[a, b]进行扩展。通过细心调整折线拐点的位置及控制分段直线的斜率,可对任一灰度区间进行扩展或压缩。这种变换适用于在黑色或白色附近有噪声干扰的情况。例如, 照片中的划痕, 由于变换后在[0, a]以及[b, $M_f$ ]之间的灰度受到压缩, 因而使污斑得到减弱。 47 | 48 | ## 4.2.3 非线性变换 49 | 50 | image-20230423194246479 51 | 52 | ### S型函数 53 | 54 | $$ 55 | \begin{aligned} 56 | & T(x)=\frac{L}{2}\left\{1+\frac{1}{\sin \left(\alpha \frac{\pi}{2}\right)} \sin \left[\alpha \pi\left(\frac{r}{L}-\frac{1}{2}\right)\right]\right\} 57 | & 0<\alpha<1 \\ 58 | & ~T(x)=\frac{D_m}{2}\left\{1+\frac{1}{\tan \left(\alpha \frac{\pi}{2}\right)} \tan \left[\alpha \pi\left(\frac{x}{D_m}-\frac{1}{2}\right)\right]\right\} 59 | & 0<\alpha<1 60 | \end{aligned} 61 | $$ 62 | 63 | ### 指数变换 64 | 65 | $$ 66 | s=c y^\gamma 67 | $$ 68 | 69 | $c$ 和 $y$ 为常数。 70 | 当 $\gamma<1$ 时, 具有扩展低亮度区、压缩高亮度区的效果; 71 | 当 $\gamma>1$ 时, 性能正好相反,具有压缩低亮度区、扩展高亮度区的效果。 72 | 而当 $c=\gamma=1$ 时, 输出正比与输入, 图像无变化。 73 | “ $\gamma$ 校正"(伽马校正),CRT显示器 74 | 75 | ### 显示器校正 76 | 77 | ![image-20230423194412359](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230423194412359.png) 78 | 79 | 图6-23 不同$\gamma$的$s=cr^{\gamma}$曲线及图像变换结果 80 | 81 | 组合灰度变换效果与直方图变图像增强与平滑化 82 | 83 | ### 组合灰度变换效果与直方图变化 84 | 85 | image-20230423194605299 86 | 87 | ### 分段线性变换 88 | 89 | ![image-20230423194641215](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230423194641215.png) -------------------------------------------------------------------------------- /digital-image-processing/VIII/8.1 引言.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 8.1引言 4 | 5 | ## 8.1.1 数学形态学 6 | 7 | 数学形态学(Mathematical Morphology)诞生于1964年, 是由法国巴黎矿业学院博士生赛拉(J. Serra)和导师马瑟荣, 在从事铁矿核的定量岩石学分析及预测其开采价值的研究中提出“击中/ 击不中变换”,并在理论层面上第一次引入了形态学的表达式, 建立了颗粒分析方法。他们的工作奠定了这门学科的理论基础, 如击中/击不中变换、开闭运算、布尔模型及纹理分析器的原型等。数学形态学的基本思想是用具有一定形态的结构元素去量度和提取图像中的对应形状以达到对图像分析和识别的目的。 8 | 9 | 数学形态学的数学基础和所用语言是集合论, 因此它具有完备的数学基础, 这为形态学用于图像分析和处理、形态滤波器的特性分析和系统设计奠定了坚实的基础。数学形态学的应用可以简化图像数据, 保持它们基本的形状特性, 并除去不相干的结构。数学形态学的算法具有天然的并行实现的结构, 实现了形态学分析和处理算法的并行, 大大提高了图像分析和处理的速度。 10 | 11 | 数学形态学是由一组形态学的代数运算子组成的, 它的基本运算有 4 个:膨胀(或扩张)、腐蚀(或侵蚀)、开启和闭合, 它们在二值图像和灰度图像中各有特点。基于这些基本运算还可推导和组合成各种数学形态学实用算法, 用它们可以进行图像形状和结构的分析及处理, 包括图像分割、特征抽取、边界检测、 图像滤波、图像增强和恢复等。数学形态学方法利用一个称作结构元素的 “探针” 收集图像的信息, 当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系, 从而了解图像的结构特征。数学形态学基于探测的思想, 与人的FOA(Focus Of Attention) 的视觉特点有类似之处。作为探针的结构元素, 可直接携带知识 (形态、大小、甚至加入灰度和色度信息) 来探测、研究图像的结构特点。 12 | 13 | 数学形态学的基本思想及方法适用于与图像处理有关的各个方面, 如基于击中/击不中变换的目标识别, 基于流域概念的图像分割, 基于腐蚀和开运算的骨架抽取及图像编码压缩, 基于测地距离的图像重建, 基于形态学滤波器的颗粒分析等。迄今为止, 还没有一种方法能像数学形态学那样既有坚实的理论基础, 简洁、朴素、统一的基本思想, 又有如此广泛的实用价值。有人称数学形态学在理论上是严谨的, 在基本观念上却是简单和优美的。 14 | 15 | 数学形态学是一门建立在严格数学理论基础上的学科, 其基本思想和方法对图像处理的理论和技术产生了重大影响。事实上, 数学形态学已经构成一种新的图像处理方法和理论, 成为计算机数字图像处理的一个重要研究领域, 并且已经应用在多门学科的数字图像分析和处理的过程中。这门学科在计算机文字识别, 计算机显微图像分析(如定量金相分析, 颗粒分析), 医学图像处理 (例如细胞检测、心脏的运动过程研究、脊椎骨癌图像自动数量描述),图像编码压缩, 工业检测(如食品检验和印刷电路自动检测), 材料科学, 机器人视觉, 汽车运动情况监测等方面都取得了非常成功的应用。另外, 数学形态学在指纹检测、经济地理、合成音乐和断层X光照像等领域也有良好的应用前景。形态学方法已成为图像应用领域工程技术人员的必备工具。目前, 有关数学形态学的技术和应用正在不断地研究和发展。 16 | 17 | ## 8.1.2 基本符号和术语 18 | 19 | ### 8.1.2.1 元素和集合 20 | 21 | 在数字图像处理的数学形态学运算中,把一幅图像称为一个集合。对于二值图像而言, 习惯上认为取值为1的点对应于景物中心,用阴影表示,而取值为0的点构成背景, 用白色表示, 这类图像的集合是直接表示的。考虑所有值为1的点的集合为 $A$, 则 $A$ 与图像是一一对应的。对于一幅图像 $A$ ,如果点a在 $A$ 的区域以内,那么就说 $a$ 是 $A$ 的元素, 记为 $a \in A$, 否则, 记作 $a \in A$, /如图81 (a)所示。 22 | 23 | ![image-20230329185543322](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329185543322.png) 24 | 25 | 图8-1 元素与集合间的关系 26 | 27 | ### 8.1.2.2 交集、并集和补集 28 | 29 | 两个图像集合 $A$ 和 $B$ 的公共点组成的集合称为两个集合的交集,记为 $A \cap B$, 即 $A \cap B=\{a \mid a \in A$ 且 $a \in B\}$ 。两个集合 $A$ 和 $B$ 的所有元素组成的集合称为两个集合的并集, 记为 $A \cup B$, 即 $A \cup B=\{a \mid$ $a \in A$ 或 $a \in B\}$ 。对一幅图像 $A$ ,在图像 $A$ 区域以外的所有点构成的集合称为 $A$ 的补集, 记为 $A^{C}$, 即 $A^{C}=\{a \mid a \notin A\}$ 。 30 | 31 | 交集、并集和补集运算是集合的最基本的运算,如图8-2所示。 32 | 33 | ![image-20230329185624376](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329185624376.png) 34 | 35 | 图8-2 集合的交集、并集和补集 36 | 37 | ### 8.1.2.3 击中(Hit)与击不中(Miss) 38 | 39 | 设有两幅图像 $A$ 和 $B$, 如果 $A \cap B \neq \phi$, 那么称 $B$ 击中 $A$, 记为 $B \uparrow A$, 其中 $\phi$ 是空集合的符号; 否则, 如果 $A \cap B=\phi$, 那么称 $B$ 击不中 $A$, 如图8-3所示。 40 | 41 | ![image-20230329185733668](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329185733668.png) 42 | 43 | 图8-3 击中与击不中 44 | 45 | (a) *B*击中*A*; (b) *B*击不中*A* 46 | 47 | ### 8.1.2.4 平移和反射 48 | 49 | 设 $A$ 是一幅数字图像(见图8-4 $a)$ ),b是一个点(见图8-$4(b) ) ,$ 那么定义 $A$ 被 $b$ 平移后的结果为 $A+b=\{a+b \mid a \in A\}$ ,即取出 $A$ 中的每个点 $a$ 的坐标值,将其与点 $b$ 的坐标值相加,得到一个新的点的坐标值 $a+b$, 所有这些新点所构成的图像就是 $A$ 被 $b$ 平移的结果, 记为 $A+b$ ,如图8-4 (c) 所示。 50 | 51 | 反射: 将A旋180度得到,如图8-4 (d) 52 | 53 | ![image-20230329185759562](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230329185759562.png) 54 | 55 | 图8-4 平移与反射 56 | 57 | ### 8.1.2.5 目标和结构元素 58 | 59 | 被处理的图像称为目标图像,一般用大写英文字母表示。为了确定目标图像的结构, 必须逐个考察图像各部分之间的关系, 并且进行检验, 最后得到一个各部分之间关系的集合。 60 | 61 | 在考察目标图像各部分之间的关系时, 需要设计一种收集信息的“探针”, 称为 “结构元素”。“结构元素”一般用大写英文字母表示, 例如用 $S$ 表示。在图像中不断移动结构元素,就可以考察图像之间各部分的关系。一般, 结构元素的尺寸要明显小于目标图像的尺寸。 62 | -------------------------------------------------------------------------------- /digital-image-processing/VI/6.7 透视变换.md: -------------------------------------------------------------------------------- 1 | # 6.7 透视变换 2 | 3 | ## 6.7.1 透视变换 4 | 5 | 把三维物体或对象转变为二维图形表示的过程称为投影变换。 6 | 7 | 根据视点 (投影中心) 与投影平面之间距离的不同, 投影可分为平行投影和透视投影, 透视投影即透视变换。平行投影的视点与投影平面之间的距离为无穷大, 而对透视投影(变换), 该距离是有限的。这个距离决定着透视投影的特性一透视缩小效应, 即三维物体或对象透视投影的大小与形体到视点的距离成反比。 例如, 等长的两直线段, 都平行于投影面, 但离投影中心近的线段, 其透视投影大, 而离投影中心远的线段, 透视投影小。这种效应所产生的视觉效果与照相机系统和人的视觉系统十分类似。 与平行投影相比, 透视投影的深度感更强, 看上去更真实, 但透视投影不能真实地反映物体的精确尺寸和形状。 8 | 9 | 对于透视投影,一束平行于投影面的平行线的投影可保持平行, 而不平行于投影面的平行线的投影会聚集到一个点, 这个点称为灭点 (Vanishing Point)。灭点可以看作是无限远处的一点在投影面上的投影。透视投影的灭点可以有无限多个, 不同方向的平行线在投影面上就能形成不同的灭点, 坐标轴方向的平行线在投影面上形成的灭点又称作主灭点。因为有 $x, y$ 和 $z$ 三个坐标轴, 所以主灭点最多有 3 个。透视投影是按主灭点的个数来分类的, 即按投影面与坐标轴的夹角来分类的, 可分为一点透视、二点透视和三点透视, 如图6-33 所示。 10 | 11 | ![image-20230428094524158](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230428094524158.png) 12 | 13 | 图6-33 透视变换 (a)一点透视; (b) 二点透视; (c) 三点透视 14 | 15 | 下面讨论一点透视。一点透视只有一个主灭点,即投影面与一个坐标轴正交,与另外两个坐标轴平行,如图6-33(a)所示。 进行一点透视投影变换,要很好地考虑图面布局, 以避免三维形体或对象的平面域积聚成直线或直线积聚成点而影响直观性。具体地说,就是要考虑下列几点: (1)三维形体或对象与画面 (投影面)的相对位置;(2)视距,即视点与畐面的距离;(3)视点的高度。 由此,假设视点在坐标原点, $Z$ 坐标轴方向与观察方向重合一致, 三维形体或对象上某一点为 $P(x, y, z)$, 一点透视变换后在投影面 (观察平面) $U O^{\prime} V$ 上的对应点为 $P^{\prime}\left(x^{\prime}, y^{\prime}, z^{\prime}\right)$, 投影面与 $z$ 轴垂直, 且与视点的距离为d, $z$ 轴过投影面窗口的中心,窗口是边长为 $2 S$ 的正方形, 如图6-34所示。根据相似三角形对应边成比例的关系, 有: 16 | 17 | $$ 18 | \begin{gathered} 19 | \frac{x^{\prime}}{x}=\frac{y^{\prime}}{y}=\frac{z^{\prime}}{z}, z^{\prime}=d \\ 20 | x^{\prime}=\frac{x}{z} d, y^{\prime}=\frac{y}{z} d, z^{\prime}=d 21 | \end{gathered}\tag{6-18} 22 | $$ 23 | 24 | 利用齐次坐标, 与二维几何变换类似, 将该过程写成变换矩阵形式为 25 | 26 | $$ 27 | \left[\begin{array}{l} 28 | x^{\prime} \\ 29 | y^{\prime} \\ 30 | z^{\prime} \\ 31 | 1 32 | \end{array}\right]=\left[\begin{array}{llll} 33 | d & 0 & 0 & 0 \\ 34 | 0 & d & 0 & 0 \\ 35 | 0 & 0 & 0 & -1 \\ 36 | 0 & 0 & 1 & 0 37 | \end{array}\right] \cdot\left[\begin{array}{l} 38 | d x \\ 39 | d y \\ 40 | -1 \\ 41 | z 42 | \end{array}\right]\tag{6-19} 43 | $$ 44 | 45 | 46 | 47 | image-20230428094807312 48 | 49 | 图6-34 一点透视变换 50 | 51 | 一般地, 视点不在原点, 投影平面是任意平面的情况,一点透视变换的矩阵也可以用一个 $4 \times 4$ 的矩阵表示。当根据公式 (6-19) 求出它的逆变换后, 可以用 $VC++$ 编写一个实现图像透视的程序, 实现图像的透视。 52 | 53 | ## 6.7.2 其他变换 54 | 55 | 如前所述, 齐次坐标为确定各种基本变换和复合变换公式提供了一个简单的方法。然而, 在许多图像处理与分析应用中, 所需的几何变换都相当复杂, 甚至有些无法用简便的数学式来表达。此外, 所需几何变换经常要从对实际图像的测量中获得, 因此更希望用这些测量结果而不是函数形式来描述几何变换。 例如, 在对由摄像机拍摄的有几何畸变的图像进行几何校正时, 首先应将一个矩形栅格目标数字化并显示出来。因为摄像机中有几何变形, 所显示的图案不会是准确的矩形, 因此所求几何变换应能使其栅格图案再次被复原为准确的矩形, 从而修正了摄像机产生的畸变。采用同样的几何变换可用于校正同一摄像机生成的数字化图像(假定畸变与景物无关), 由此可得到不畸变的图像。 56 | 57 | 图像几何变换的一个重要应用是消除由于摄像机导致的数字图像的几何畸变。当需要从数字图像中得到定量的空间测量数据时, 几何校正被证明是十分重要的。某些图像, 例如, 从卫星上或飞机侧视雷达上得到的图像, 都有相当严重的几何变形, 这些图像需要先经过几何校正,然后才能对其内容做出解释。一些图像系统使用非矩形的像素坐标, 例如, 极坐标、柱坐标、 球面坐标等, 用普通的显示设备观察这些图像时, 必须先对它们进行校正, 也就是说, 将其转换为矩形像素坐标。例如, 在油 (水) 井套管缺陷识别中, 有时需要将极坐标系中的内突镜图像转换为直角坐标系中的图像, 然后进行分析与处理, 如图6-35、 6-36所示。 58 | 59 | image-20230428094837780 60 | 61 | 图6-35 极坐标系中的内突镜图像 62 | 63 | ![image-20230428094904309](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230428094904309.png) 64 | 65 | 图6-36 转换为直角坐标系中的图像 66 | 67 | 有时机器人的鱼眼透镜拍摄的变形严重的一幅图像, 也可以设计一个适当的几何变换将其校正到矩形坐标系统, 这样, 可用立体视觉测距技术对机器人周围的物体进行三维空间定位。 68 | 69 | 几何变换的另一个应用是对相似的图像进行配准, 以便进行图像比较, 典型的应用是利用图像相减来检测运动或变化。 有时, 为便于解释需将图像以另一种样式表示, 这时也会用到几何变换, 地图绘制中的图像投影也会用到几何变换。例如, 在利用从宇宙飞船传回来的图像, 拼成地球、月球及行星的航拍镶嵌地图时, 就必须用几何变换。有关这些变换及其应用的详细内容请参阅书后的参考文献。 70 | 71 | -------------------------------------------------------------------------------- /digital-image-processing/VI/6.3 图像平移.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 6.3 图像平移 4 | 5 | ## 6.3.1 图像平移变换 6 | 7 | ![image-20230328151524099](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230328151524099.png) 8 | 9 | 图6-12 图像平移 10 | 11 | 设点 $P_{0}\left(x_{0}, y_{0}\right)$ 进行平移后, 移到 $P(x, y)$, 其中 $x$ 方向的平移量为 $\Delta x, y$ 方向的平移量为 $\Delta y$ 。那么,点 $P(x, y)$ 的坐标为 12 | 13 | $$ 14 | \left\{\begin{array}{l} 15 | x=x_{0}+\Delta x \\ 16 | y=y_{0}+\Delta y 17 | \end{array}\right. 18 | $$ 19 | 20 | 利用齐次坐标, 变换前后图像上的点 $P_{0}\left(x_{0}, y_{0}\right)$ 和 $P(x, y)$ 之间的关系可以用如下的矩阵变换表示为 21 | 22 | $$ 23 | \left[\begin{array}{l} 24 | x \\ 25 | y \\ 26 | 1 27 | \end{array}\right]=\left[\begin{array}{lll} 28 | 1 & 0 & \Delta x \\ 29 | 0 & 1 & \Delta y \\ 30 | 0 & 0 & 1 31 | \end{array}\right]\left[\begin{array}{l} 32 | x_0 \\ 33 | y_0 \\ 34 | 1 35 | \end{array}\right]\tag{6-2} 36 | $$ 37 | 对变换矩阵求逆, 可以得到式 (6-2) 的逆变换 38 | $$ 39 | \left[\begin{array}{l} 40 | x_{0} \\ 41 | y_{0} \\ 42 | 1 43 | \end{array}\right]=\left[\begin{array}{ccc} 44 | 1 & 0 & -\Delta x \\ 45 | 0 & 1 & -\Delta y \\ 46 | 0 & 0 & 1 47 | \end{array}\right]\left[\begin{array}{l} 48 | x \\ 49 | y \\ 50 | 1 51 | \end{array}\right] 52 | $$ 53 | 54 | 即 55 | 56 | $$ 57 | \left\{\begin{array}{l} 58 | x_{0}=x-\Delta x \\ 59 | y_{0}=y-\Delta y 60 | \end{array}\right. 61 | $$ 62 | 63 | 这样, 平移后的图像上的每一点都可以在原图像中找到对应的点。例如, 对于新图中的 $(0,0)$ 像素, 代入上面的方程组,可以求出对应原图中的像素 $(-\Delta x,-\Delta y)$ 。如果 $\Delta x$ 或 $\Delta y 大于 0$, 则点 $(-\Delta x,-\Delta y)$ 不在原图像中。对于不在原图像中的点, 可以直接将它的像素值统一设置为 0 或者255 (对于灰度图就是黑色或白色)。同样, 若有像素点不在原图像中, 也就说明原图像中有点被移出显示区域。如果不想丢失被移出的部分图像, 可以将新生成的图像宽度扩大 $|\Delta x|$, 高度扩大 $|\Delta y|$ 。 64 | 65 | 66 | 67 | 图6-13 平移前的图像 68 | 69 | 70 | 71 | 72 | 73 | 图6-14 平移后的图像 74 | 75 | 76 | 77 | 图6-15 平移扩大后的图像 78 | 79 | 80 | 81 | ## 6.3.2 图像平移的算法 82 | 83 | 按照上述理论, 可以比较容易地用 VC++来实现图像的平移。 下面介绍灰度图像的平移, 因为灰度图像每个像素位数正好是 8 位, 即 1 个字节, 在进行图像处理时可以不用考虑拼凑字节的问题。而且由于灰度图像调色板的特殊性, 进行灰度图像处理时不必考虑调色板的问题。所以, 在介绍图像处理时,一般采用灰度图像, 以便将重点放在算法本身。由上述分析, 可以得到实现图像平移的算法如下。 84 | 85 | ```c++ 86 | //***************************************** 87 | //函数名称: BOOL TranslationPixel() 88 | //基本功能: 本函数对传入的CDibObject对象中的图像进行逐点平移操作 89 | //参数说明: long lXOffset X轴平移量(像素数) 90 | // long lYOffset Y轴平移量(像素数) 91 | //返回值: BOOL 成功返回TRUE, 失败返回FALSE 92 | //注意: 该函数不会改变图像的大小, 移出的部分图像将截去, 空白部分用白色填充 93 | //***************************************** 94 | BOOL CGeoTrans:: TranslationPixel(long lXOffset, long lYOffset, CDibObject *pDibObject) 95 | { 96 | //定义变量, 获得源图像指针及其图像信息, 为新图像分配内存及用白色填充新图 97 | //由图像位数确定的移动字节数nMovedBits, 对于灰度图像有nMovedBits = 1 98 | //每行 99 | for(y = 0; y < nHeight; y++) 100 | { 101 | pNewTemp = pNewBits; 102 | pNewTemp += (nHeight -1-y) * nWidthBytes; 103 | //每列 104 | for(x = 0; x < nWidth; x++) 105 | { 106 | //指向新DIB第y行, 第x个像素的指针, 计算该像素在源DIB中的坐标 107 | int x0 = x – lXOffset; 108 | int y0 = y – lYOffset; 109 | //判断是否在源图范围内 110 | if( (x0 >= 0) && (x0 < nWidth) && (y0 >= 0) && (y0 < nHeight)) 111 | { 112 | //指向源DIB第y0行, 第x0个像素的指针 113 | pOldTemp = pOldBits; 114 | pOldTemp += (nHeight -1-y0) * nWidthBytes; 115 | pOldTemp += x0 * nMovedBits; 116 | //复制像素 117 | memcpy( pNewTemp, pOldTemp, nMovedBits ); 118 | } 119 | pNewTemp += nMovedBits; 120 | } 121 | } 122 | //用新图像数据填充源图像数据区 123 | memcpy( pOldBits, pNewBits, nWidthBytes * nHeight ); 124 | } 125 | ``` 126 | 127 | -------------------------------------------------------------------------------- /digital-image-processing/V/5.7 编程实例.md: -------------------------------------------------------------------------------- 1 | # 5.7 编程实例 2 | 3 | 根据前面章节的讨论, 图像退化的模型为 4 | $$ 5 | g(x, y)=f(x, y) * h(x, y)+n(x, y) 6 | $$ 7 | 那么,图像复原的过程可认为是已知$g(x,y),h(x,y),n(x,y)$的一些先验知识,求出$f(x,y)$。对于不同的退化函数和噪声性质, 可推导出前面介绍的一些图像复原方法。本节介绍实际中经常用到的逆滤波复原图像法。 8 | 9 | 图像的点扩展函数$h$为 10 | $$ 11 | h=\frac{1}{49} 12 | \left[ 13 | \begin{array}{lllllll} 14 | 1 &1& 1& 1& 1& 1& 1\\ 15 | 1 &1& 1& 1& 1& 1& 1\\ 16 | 1 &1& 1& 1& 1& 1& 1\\ 17 | 1 &1& 1& 1& 1& 1& 1\\ 18 | 1 &1& 1& 1& 1& 1& 1\\ 19 | 1 &1& 1& 1& 1& 1& 1\\ 20 | 1 &1& 1& 1& 1& 1& 1\\ 21 | \end{array} 22 | \right] 23 | $$ 24 | 首先使用退化函数$h$对图像进行模糊操作, 生成一幅退化的图像,退化系统为 25 | $$ 26 | g=F^{-1}(F(h) \cdot F(f)) 27 | $$ 28 | 上式的计算过程是,先求出图像和退化函数的傅立叶变换, 在频域相乘后,再按下式求逆傅立叶变换: 29 | $$ 30 | \hat{f}=F^{-1}\left(\frac{G}{H}\right)=F^{-1}\left(\frac{F(g)}{F(h)}\right) 31 | $$ 32 | 图像复原的具体实现过程如下。 33 | 34 | ## 添加菜单 35 | 36 | image-20230427091359893 37 | 38 | 图11-7 图像复原菜单 39 | 40 | ## 添加消息映射 41 | 42 | 在文档类中添加两个消息映射函数, 分别是OnRestoreBlur()和OnRestoreInvfilt()。OnRestorBlur()调用图像复原类CRestore的ConvBlur()函数生成一幅退化图像。OnRestoreInvfilt()调用图像复原类CRestore的InvFilter()函数对退化图像进行复原。代码如下: 43 | 44 | ```c++ 45 | void CDipDoc: : OnRestoreBlur() 46 | { 47 | // TODO: Add your command handler code here 48 | //判断当前是否载入图像 49 | if( m_pImageObject == NULL ) return; D 50 | //定义一个图像复原对象 51 | CRestore Restore( m_pImageObject ); 52 | //调用卷积模糊函数 53 | Restore.ConvBlur(); 54 | //更新视图 55 | UpdateAllViews(NULL); 56 | } 57 | OnRestoreInvfilt()函数主要代码如下, 其他代码与OnRestoreBlur()相同。 58 | void CDipDoc: : OnRestoreInvfilt() 59 | { 60 |  61 | //调用逆滤波复原函数 62 | Restore.InvFilter(); 63 |  64 | } 65 | 66 | ``` 67 | 68 | ## CRestore类介绍 69 | 70 | 功能: 实现图像复原 71 | 函数列表: 72 | ConvBlur() 对图像进行卷积模糊处理, 生成一幅待复原的退化图像; 73 | InvFilter() 逆滤波复原法, 对由卷积模糊所造成的退化图像进行复原; 74 | ConvNoiseBlur() 对图像进行卷积噪声模糊处理, 生成一幅待复原的退化图像; 75 | Wiener() 维纳滤波复原法, 对由卷积噪声所造成的退化图像进行复原。 76 | 77 | ## 函数实现代码 78 | 79 | ```c++ 80 | ConvBlur()函数关键代码 81 | { 82 |  83 | //定义卷积模板, 大小为7×7 84 | Mm m_matFilter; 85 | m_matFilter=zeros(nHeight, nWidth); 86 | int i, j; 87 | for(i=1; i<7; i++) 88 | { 89 | for(j=1; j<7; j++) 90 | { 91 | m_matFilter.r(i, j)=0.02; 92 | } 93 | } 94 | // m_matBits是一个二维矩阵, 存储的是图像数据 95 | //对原图像进行快速傅立叶变换, 将图像从空域变换到频域 96 | m_matBits=fft2(m_matBits); 97 | //对模板进行快速傅立叶变换 98 | m_matFilter=fft2(m_matFilter); 99 | //频率相乘 100 | for(i=1; i<=nHeight; i++) 101 | { 102 | for(j=1; j<=nWidth; j++) 103 | { 104 | m_matBits.r(i, j)=m_matBits.r(i, j)*m_matFilter.r(i, j)-m_matBits.i(i, j)*m_matFilter.i(i, j); 105 | m_matBits.i(i, j)=m_matBits.r(i, j)*m_matFilter.i(i, j)+m_matBits.i(i, j)*m_matFilter.r(i, j); 106 | } 107 | } 108 | //对图像做逆傅立叶变换, 将图像从频域变换到空域 109 | m_matBits=ifft2(m_matBits); 110 |  111 | } 112 | InvFilter()函数关键代码 113 | { 114 | //对原图像进行快速傅立叶变换, 将图像从空域变换到频域 115 | m_matBits=fft2(m_matBits); 116 | //对模板进行快速傅立叶变换 117 | m_matFilter=fft2(m_matFilter); 118 | //频率相乘 119 | double a, b, c, d; 120 | for(i=1; i<=nHeight; i++) 121 | { 122 | for(j=1; j<=nWidth; j++) 123 | { 124 | a=m_matBits.r(i, j); 125 | b=m_matBits.i(i, j); 126 | c=m_matFilter.r(i, j); 127 | d=m_matFilter.i(i, j); 128 | if(c*c+d*d>0.003) 129 | { 130 | m_matBits.r(i, j)=(a*c+b*d)/(c*c+d*d); 131 | m_matBits.i(i, j)=(b*c-a*d)/(c*c+d*d); 132 | } 133 | } 134 | } 135 | //对图像进行快速逆傅立叶变换, 将图像从频域变换到空域 136 | m_matBits=ifft2(m_matBits); 137 | } 138 | 139 | ``` 140 | 141 | image-20230427091624420 142 | 143 | 图11-8 逆滤波法复原图像 144 | (a) 原始图像; (b) 退化图像; (c)复原图像 -------------------------------------------------------------------------------- /digital-image-processing/VI/6.8 应用实例.md: -------------------------------------------------------------------------------- 1 | # 6.8 应用实例 2 | 3 | 下面给出图像几何变换应用的一个例子一图像的转置。像的转置是将给定图像像素的x坐标和y坐标互换的几何变换。 4 | 5 | 图像的转置和图像的旋转不同, 而且仅仅通过旋转是不可能实现图像转置的。旋转操作与镜像操作结合才能实现图像的转置。图像转置的方法如下: 6 | 7 | 首先将图像水平镜像, 然后逆时针旋转 $90^{\circ}$ 才可以实现。设点 $P_{0}\left(x_{0}, y_{0}\right)$ 进行转置后的对应点为 $P(x, y)$, 图像高度为 $f H e i g h t$, 宽度为fWidth, 原图像中 $P_{0}\left(x_{0}, y_{0}\right)$ 经过转置后坐标将变为 $\left(y_{0}, x_{0}\right)$ 。 如果把图像转置看作是图像镜像与旋转的复合, 并且图像的水平镜像在 $x$ 方向不作平移。此时, 6.4.1中的公式 (6-4) 变为 8 | $$ 9 | \left[\begin{array}{l} 10 | x \\ 11 | y \\ 12 | 1 13 | \end{array}\right]=\left[\begin{array}{rrr} 14 | -1 & 0 & 0 \\ 15 | 0 & 1 & 0 \\ 16 | 0 & 0 & 1 17 | \end{array}\right] \cdot\left[\begin{array}{l} 18 | x_{0} \\ 19 | y_{0} \\ 20 | 1 21 | \end{array}\right] 22 | $$ 23 | 24 | 根据此式及6.5.1中的公式 (6-6) 可得 25 | 26 | $$ 27 | \begin{aligned} 28 | & {\left[\begin{array}{l} 29 | x \\ 30 | y \\ 31 | 1 32 | \end{array}\right]=\left[\begin{array}{rrr} 33 | \cos \theta & \sin \theta & 0 \\ 34 | -\sin \theta & \cos \theta & 0 \\ 35 | 0 & 0 & 1 36 | \end{array}\right]\left[\begin{array}{rrr} 37 | -1 & 0 & 0 \\ 38 | 0 & 1 & 0 \\ 39 | 0 & 0 & 1 40 | \end{array}\right] \cdot\left[\begin{array}{l} 41 | x_{0} \\ 42 | y_{0} \\ 43 | 1 44 | \end{array}\right]\left(\theta=90^{\circ}\right)} \\ 45 | & {\left[\begin{array}{l} 46 | x \\ 47 | 1 48 | \end{array}\right]=\left[\begin{array}{rrr} 49 | 0 & 1 & 0 \\ 50 | -1 & 0 & 0 \\ 51 | 0 & 0 & 1 52 | \end{array}\right] \cdot\left[\begin{array}{rrr} 53 | -1 & 0 & 0 \\ 54 | 0 & 1 & 0 \\ 55 | 0 & 0 & 1 56 | \end{array}\right] \cdot\left[\begin{array}{l} 57 | x_{0} \\ 58 | y_{0} \\ 59 | 1 60 | \end{array}\right]=\left[\begin{array}{lll} 61 | 0 & 1 & 0 \\ 62 | 1 & 0 & 0 \\ 63 | 0 & 0 & 1 64 | \end{array}\right] \cdot\left[\begin{array}{l} 65 | x_{0} \\ 66 | y_{0} \\ 67 | 1 68 | \end{array}\right]} 69 | \end{aligned}\tag{6-20} 70 | $$ 71 | 72 | 公式(6-20)就是图像转置的变换公式。 73 | 74 | 事实上,(6-19) 也可以直接得到, 因为原图像中 $P_{0}\left(x_{0}, y_{0}\right)$ 经过转置后坐标将变为 $P\left(y_{0}, x_{0}\right)$, 即 $x=y_{0}, y=x_{0}$, 把这个关系用齐次坐标写成矩阵形式就是式(6-20)。 75 | 76 | 图像转置的实现和图像镜像变换类似, 不同之处在于图像转置后DIB的头文件也要进行相应的改变, 主要是将头文件中图像高度和宽度信息更新。因此传递给图像转置函数的参数是直接指向DIB的指针, 而不是直接指向DIB像素的指针。下面给出实现图像转置函数TransposeDIB()的框架和主要算法。 77 | 78 | ```verilog 79 | //****************************************** 80 | // 函数名称: BOOL Transpose() 81 | // 基本功能: 本函数对传入的CDibObject对象中的图像进行转置操作 82 | // 参数说明: CDibObject *pDibObject 默认为NULL 83 | // 返回值: BOOL 转置成功返回TRUE, 否则返回FALSE 84 | //****************************************** 85 | BOOL CGeoTrans: : Transpose(CDibObject *pDibObject) 86 | { 87 | //定义指向源图像及新图像的指针、 位图数据指针、 调色板等指针变量 88 | //获取源图像指针及文件头、 信息头、 调色板及图像数据等信息 89 | //计算新图像大小(包括文件头、 信息头、 调色板和图像数据) 90 | //为新图像分配内存, 指定新图像的文件头、 信息头、 调色板及图像数据指针 91 | //用255填充新图像数据区, 用源图像的文件头、 信息头填充相应的新图像 92 | //调整文件总字节数、 新图像的宽度和高度等信息, 用原调色板填充新调色板 93 | //由图像位数确定的移动字节数 94 | int nMovedBits = 1; 95 | switch( m_pDibObject->GetNumBits() ) 96 | { 97 | case 8: 98 | nMovedBits = 1; 99 | break; 100 | case 16: 101 | nMovedBits = 2; 102 | break; 103 | case 24: 104 | nMovedBits = 3; 105 | break; 106 | case 32: 107 | nMovedBits = 4; 108 | break; 109 | } 110 | // 针对图像每行进行操作 111 | for(y = 0; y < nOldHeight; y++) 112 | { 113 | //指向源图像第y行 114 | pOldTemp = pOldBits; 115 | pOldTemp += (nOldHeight -1 -y) * nOldWidthBytes; 116 | // 针对每行图像每列进行操作 117 | for(x = 0; x < nOldWidth; x++) 118 | { 119 | //指向转置后的图像第x行, 第y个像素的指针 120 | pNewTemp = pNewBits; 121 | pNewTemp += (nNewHeight -1 -x) * nNewWidthBytes; 122 | pNewTemp += y * nMovedBits; 123 | //复制像素 124 | memcpy(pNewTemp, pOldTemp, nMovedBits); 125 | pOldTemp += nMovedBits; 126 | } 127 | } 128 | //将内存解锁和将不再使用的内存释放,将新图像设置为当前图像,返回TRUE 129 | } 130 | 131 | ``` 132 | 133 | 134 | 135 | 图6-37 转置后的图像 -------------------------------------------------------------------------------- /digital-image-processing/V/5.6 其他图像复原技术.md: -------------------------------------------------------------------------------- 1 | # 5.6 其他图像复原技术 2 | 3 | ## 5.6 几何畸变校正 4 | 5 | 数字图像在获取过程中,由于成像系统的非线性,成像后的图像与原景物图像相比,会产生比例失调,甚至扭曲,我们把这类图像退化现象称之为几何畸变。典型的几何失真如图5-4所示。 6 | 7 | image-20230426164500568 8 | 9 | 图5-4 几种典型的几何失真 10 | (a) 原图像; (b) 梯形失真; (c) 枕形失真; (d) 桶形失真 11 | 12 | 一般,几何畸变校正要对失真的图像进行精确的几何校正, 通常是先确定一幅图像为基准,然后去校正另一幅图像的几何形状。因此,几何畸变校正一般分两步来做:第一步是图像空间坐标的变换;第二步是重新确定在校正空间各像素点的取值。 13 | 14 | ### 空间几何坐标变换 15 | 16 | 按照一幅标准图像 $g(u, v)$ 或一组基准点去校正另一幅几何失真图像 $f(x, y)$, 称之为空间几何坐标变换。根据两幅图像的一些 已知对应点对(也称为控制点对)建立起函数关系式, 将失真图像的 $x-y$ 坐标系变换到标准图像 $u-v$ 坐标系, 从而实现失真图像按标准图像的几何位置校正, 使 $f(x, y)$ 中的每一像点都可在 $g(u, v)$ 中找到对应像点。 17 | 18 | ### 三角形线性法 19 | 20 | 图像的几何失真虽然是非线性的,但在一个局部小区域内可近似认为是线性的,基于这一假设,将标准图像和被校正图像之间的对应点对划分成一系列小三角形区域,三角形顶点为三个控制点, 在三角形区内满足以下线性关系: 21 | $$ 22 | \left\{\begin{array}{l} 23 | x=a u+b v+c \\ 24 | y=d u+e v+f 25 | \end{array}\right.\tag{5-52} 26 | $$ 27 | 若三对控制点在两个坐标系中的位置分别为 $\left(x_1, y_1\right) 、\left(x_2, y_2\right)$ 、 $\left(x_3, y_3\right)$ 和 $\left(u_1, v_1\right) 、\left(u_2, v_2\right) 、\left(u_3, v_3\right)$, 则可建立两级方程组: 28 | $$ 29 | \left\{\begin{array}{l} 30 | x_1=a u_1+b v_1+c \\ 31 | x_2=a u_2+b v_2+c \\ 32 | x_3=a u_3+b v_3+c 33 | \end{array}\right.\tag{5-53a} 34 | $$ 35 | 36 | $$ 37 | \left\{\begin{array}{l} 38 | y_1=d u_1+e v_1+f \\ 39 | y_2=d u_2+e v_2+f \\ 40 | y_3=d u_3+e v_3+f 41 | \end{array}\right.\tag{5-53b} 42 | $$ 43 | 44 | 解方程组(5-53),可求出a, b, c, d, e, f六个系数。用式(5-53)可实现该三角形区内其他像点的坐标变换。对于不同的三角形控制区域,这六个系数的值是不同的。 45 | 三角形线性法简单,能满足一定的精度要求,这是因它是以局部范围内的线性失真去处理大范围内的非线性失真, 所以选择的控制点对越多,分布越均匀,三角形区域的面积越小, 则变换的精度越高。但是控制点过多又会导致计算量的增加, 因此需要综合考虑。 46 | 47 | ### 灰度值的确定 48 | 49 | 图像经几何位置校正后,在校正空间中各像点的灰度值等于被校正图像对应点的灰度值。一般校正后的图像某些像素点可能挤压在一起,或者分散开,不会恰好落在坐标点上,因此常采用内插法来求得这些像素点的灰度值。经常使用的方法有如下两种。 50 | 51 | 1) 最近邻点法 52 | 最近邻点法是取与像素点相邻的4个点中距离最近的邻点灰度值作为该点的灰度值。如图5-5所示。显然,最近邻点法计算简单,但精度不高,同时校正后的图像亮度有明显的不连续性。 53 | 54 | image-20230426164921878 55 | 56 | 图5-5 最近邻点法 57 | 58 | 2. 内插法 59 | 用像素点周围4个邻点的灰度值加权内插作为g(u0, v0),如图5-6所示,设像素点(x0, y0)周围4个点为$(x_1, y_1), (x_1+1, y_1), (x_1, y_1+1), (x_1+1, y_1+1)$,则校正值为 60 | 61 | $$ 62 | \begin{aligned} 63 | g\left(u_0, v_0\right)= & (1-\alpha)(1-\beta) f\left(x_1, y_1\right)+\alpha(1-\beta) f\left(x_1+1, y_1\right) \\ 64 | & +(1-\alpha) \beta f\left(x_1, y_1+1\right)+\alpha \beta f\left(x_1+1, y_1+1\right) 65 | \end{aligned}\tag{5-54} 66 | $$ 67 | 68 | 式中: 69 | $$ 70 | \alpha=\left|x_0-x_1\right|, \beta=\left|y_0-y_1\right| 71 | $$ 72 | image-20230426165105630 73 | 74 | 图5-6 内插法几何校正 75 | 76 | ## 5.6.2 盲目图像复原 77 | 78 | 盲目图像复原法是在没有图像退化先验知识的情况下,对观察目标的多幅图像以某种方式抽出退化信息, 从而进行图像复原的方法。 79 | 加性噪声的模糊图像复原方法一般有两种: 直接测量法和间接估计法。 80 | 用直接测量法复原图像时,需要测量图像的模糊脉冲响应和噪声功率谱或协方差函数。在所观察的景物中,点光源能量往往直接指示出冲激响应;另外,图像边缘是否陡峭也能用来推测模糊冲激响应。在背景亮度相对恒定的区域内测量图像的协方差,可以估计出观测图像的噪声协方差函数。 81 | 82 | 间接估计法复原图像类似于多图像平均法处理。如对一个景物连续拍摄 $N$ 次, 每一次获取的图像用下式表示: 83 | $$ 84 | g_i(x, y)=f(x, y)+n_i(x, y) \quad i=1,2, \ldots, N\tag{5-55} 85 | $$ 86 | 式中: $f(x, y)$ 是原始图像, $g_i(x, y)$ 是第次获取的图像, $n_i(x, y)$ 是第 $i$ 次的噪声函数。 87 | $$ 88 | f(x, y)=\frac{1}{N} \sum_{i=1}^N g_i(x, y)-\frac{1}{N} \sum_{i=1}^N n_i(x, y)\tag{5-56} 89 | $$ 90 | 当 $N$ 很大时, 上式右边的噪声项的值趋于它的数学期望 $E\{n(x$, $y)\}$ 。一般情况下白色高斯噪声在所有 $(x, y)$ 上的数学期望等于零。 因此,原始图像为 91 | $$ 92 | f(x, y)=\frac{1}{N} \sum_{i=1}^N g_i(x, y)\tag{5-57} 93 | $$ 94 | 盲目图像复原 95 | 若 $g_{i}(x, y)=f_{i}(x, y)^* h_{i}(x, y)$ 96 | 则 $G_i(n, v)=F_i(u, v) H_{i}(u, v)$ 97 | $\ln G_{i}(n, v)=\ln \left[F_{i}(u, v)\right]+\ln \left[H_{i}(u, v)\right]$ 98 | 如果帧间退化冲激响应不相关, 则 99 | $$ 100 | \sum_{i=1}^M \ln \left[G_i(u, v)\right]=M \ln \left[F_i(u, v)\right]+\sum_{i=1}^M \ln \left[H_i(u, v)\right] 101 | $$ 102 | 当M很大时, 传递函数的对数和接近一恒定值 103 | $$ 104 | \begin{gathered} 105 | K_H=\lim _{M \rightarrow \infty} \sum_{i=1}^M \ln \left[H_i(u, v)\right] \quad \hat{F}_i(u, v)=\exp \left\{\frac{k_H(u, v)}{M} \prod_{i=1}^M\left[G_i(u, v)\right]^{\frac{1}{M}}\right\} \\ 106 | \hat{f}(x, y)=J^{-1}\left[\hat{F_G}(u, v)\right] 107 | \end{gathered} 108 | $$ -------------------------------------------------------------------------------- /digital-signal-processing/1.绪论.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 绪论 4 | 5 | ## 前言——为什么要研究数字信号处理 6 | 7 | (这段是编者写的,文笔很渣请见谅) 8 | 9 | 信号处理是计算机科学、通信科学的重要问题,也是人工智能、自动控制等技术的基础,它分为三条主线。 10 | 11 | - 基本信号及其响应; 12 | - 信号的分解; 13 | - 线性时(移)不变系统分析。 14 | 15 | 传统的基于连续系统的信号处理方式存在不足,因此我们需要研究数字信号处理——以离散信号和系统为研究对象 16 | 17 | ### 数字化的必要性 18 | 19 | 在数字电子技术、计算机技术成熟之前,信号处理主要依赖连续系统完成相关功能,这点在较为落后的那部分无线电技术中有很明显的体现,但连续系统一般通过模拟电路来实现,信号和系统对客观物理规律的依赖导致对信号进行处理时要考虑的要素很多,而且系统各部分存在耦连(如阻抗匹配),难以模块化, 20 | 21 | 为了方便CPU和其他数字电路的处理,我们需将信号和系统分别离散化。这样一来,利用软件和软件化的硬件构建系统对离散信号处理就大大提高了设计的效率和灵活性。 22 | 23 | ### 数字化遇到的问题 24 | 25 | 从连续到离散的变化对信号处理理论提出了新的要求,包括但不限于: 26 | 27 | - 信号不失真采样 28 | - 离散信号恢复为连续信号 29 | - 离散系统的设计 30 | 31 | 《数字信号处理》这门课程在整个信号处理领域的重要性仅次于《信号与系统》,这门课程提供了一系列高效的信号处理算法,比如FFT(快速傅里叶变换),FIR(有限冲激响应滤波器),IIR(无限冲激响应滤波器)算法乃至于卡尔曼滤波、维纳滤波等现代滤波算法。 32 | 33 | 这些算法可由软件也可由硬件实现。软件方案具有灵活性,开发效率高,但对硬件的要求较高。硬件方案的优点则为高校、实时,但开发难度大,开发周期长。 34 | 35 | 目前实现DSP算法的常用平台有: 36 | 37 | - 通用处理器 38 | - 嵌入式处理器 39 | - FPGA 40 | - DSP 41 | - GPU 42 | - DPU 43 | 44 | 以上几种方案各有优劣,此处不再赘述 45 | 46 | ## 数字信号处理 Digital Signal Processing 47 | 48 | 教材和教学内容 49 | 50 | 教材:《数字信号处理教程》程佩青 清华大学出版社 51 | 52 | 章节: 53 | 54 | - 一、离散时间信号与系统 55 | 56 | - 二、z变换 57 | 58 | - 三、离散傅里叶变换 (DFT) 59 | 60 | - 四、快速傅里叶变换 (FFT) 61 | 62 | - 五、数字滤波器的基本结构 63 | 64 | - 六、无限冲激响应滤波器 (IIR) 设计 65 | 66 | - 七、有限冲激响应滤波器 (FIR) 设计 67 | 68 | 69 | 在学科发展上, 数字信号处理又和最优控制, 通信理论, 故障诊断等紧紧相连, 成为人工智能, 模式识别, 神经网络, 数字通信等新兴学科的理论基础。 70 | 71 | ### 数字信号处理的特点 72 | 73 | 与模拟信号处理相比,数字信号处理具有如下特点: 74 | 75 | 1. 精度高、可获得高性能指标:模拟信号处理的精度很难达到$10^{-3}$,而17bit. 字长的数宇系统的精度可达 $10^{-5}$ 。 76 | 77 | 2. 灵活性好:数宇信号处理的性能主要决定于乘法器的各系数,且系数存放于系数存储器内,只需改变存储器的系数,就可得到不同的系统,比改变模拟系统方便得多。 78 | 79 | 3. 时分复用:可同时处理多个数宇通道的信号。 80 | 81 | 4. 可靠性高、抗干扰能力强:模拟信号处理易受各种干扰。数字信号只有0和1两个电平,受噪声和环境干扰小。 82 | 83 | ### 数字信号处理发展历程 84 | 85 | + 1669-Newton偶然发现了光谱,却没有意识到" 频率" 的概念 86 | 87 | + 1807-Fourier分析诞生 88 | 89 | + 19th/20th century-出现了两种Fourier分析方法-Continuous & Discrete(编者注:连续和离散) 90 | 91 | + 1965-IBM's Cooley&Tukey发明了FFT(Fast Fourier Transform) 算法,使FFT得以在计算机平台上快速实现————标志着DSP学科的产生 92 | 93 | + 1978-出现第一块DSP芯片(TI,德州仪器),主要用于军事 94 | 95 | + 80年代–随看大规模集成电路技术、微电子技术、半导体技术的发展,出现了专用的离散时间信号处理高速定点、浮点计算器,数字产品民用化 96 | 97 | + 90年代至今-DSP技术发展迅速,渗入到人们学习、工作、生活各方各面;同时出现了新的DSP理论和方法,如现代谱分析、小波等 98 | 99 | 100 | ### 信号 101 | - 信号是信息的载体 102 | 103 | - 信号的分类 104 | ``` mermaid 105 | graph LR; 106 | 分类方法 --> 确定性 107 | 108 | 分类方法 --> 维数 109 | 分类方法 --> 连续 110 | 111 | 确定性--> A1["随机信号(随机过程)"] 112 | 确定性 --> A2["确定信号(确定过程)"] 113 | 114 | 维数 --> A3["一维信号(语音信号、电压、电流信号)"] 115 | 116 | 维数 --> A4["二维信号(图像信号)"] 117 | 118 | 维数 --> A5["三维信号(立体图像等)"] 119 | 120 | 连续 --> A6["离散信号(数字信号)"] 121 | 122 | 连续 --> A7["连续信号(模拟信号)"] 123 | 124 | 125 | ``` 126 | 127 | 128 | 129 | ### 系统 130 | 131 | 系统是对信号进行处理实现某功能的物理设备 132 | 主要功能: 133 | - 信号更清晰 134 | - 提取有用信息 135 | 136 | 137 | 138 | 139 | 140 | ### 数字信号处理系统 141 | 142 | 数字信号处理系统框图: 143 | ![image-20220720115424040](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20220720115424040.png) 144 | 145 | - 对连续信号进行等间隔采样时,若不能满足采样定理,采样后信号的频率就会重叠,即高于采样频率一般的频率将被重建成低于采样频率一半的信号,这种频谱的重叠导致的失真成为混叠(Aliasing) 146 | - 量化编码不能瞬时完成,因此抽样保持既要对模拟信号进行抽样(时间离散化)又要将抽样的幅度保持以完成量化编码,量化编码将送入的抽样保持信号的幅度加以量化并形成二进制编码信号(数字信号) 147 | 148 | 149 | 150 | ### 数字信号处理器 151 | 152 | 数字信号处理器:DSP芯片,是一种特别适合于进行数字信号处理运算的微处理器,其主要应用是实时快速地实现各种数字信号处理算法。 153 | 154 | 根据数宇信号处埋的要求,DSP芯片一般具有如下主要特点 155 | 156 | - 在一个指令周期内可穴成一次乘法和一次加法 157 | - 程序和数据空间分开,可以同时访问指令和数据 158 | - 片内具有快速RAM,通常可通过独立的数据总线在两块见同时访问 159 | - 具有低开销或无开销循环及跳转的硬件支持 160 | - 快速的中断处理和硬件I/O支持 161 | - 貝有在单周期内操作的多个硬件地址产生器 162 | - 可以井行执行多个捚作 163 | - 支持流水线操作,使取值、译码和执行等操作可以重叠执行 164 | 165 | ### 数字信号处理的实现方法 166 | 167 | - 采用大、中/型计算机和微机 168 | 169 | 工作站和微机上各厂家的数字信号软件,如有各种图象压缩和解压软件 170 | 171 | - 用单片机 172 | 173 | 根据不同环境配不同单片机,其能达实时控制,但数据运算量不能太大 174 | 175 | - 利用通用DSP芯片 176 | 177 | DSP芯片较之单片机有着更为突出优点。如内部带有乘法器,累加器,采用流水线工作方式及并行结构,多总线速度快。配有适于信号处理的指令(如FFT指令)等。 美国德州仪器公司Texas Instrument (TI),Analog Devices, Lucent, Motorola, AT&T等公司都有生产 178 | 用通用的可编程的数字信号处理器实现法————是目前重要的数字信号处理实现方法,它即有硬件实现法实时的优点,又具有软件实现的灵活性优点。 179 | ![](https://cdn.mathpix.com/cropped/2022_06_17_60f339476bf43ebb18e6g-27.jpg?height=434&width=1164&top_left_y=499&top_left_x=283) 180 | 181 | 182 | - 利用特殊用途的DSP芯片 183 | 184 | 市场上推出专门用于FFT,FIR滤波器,卷积、相关等专用数字芯片。其软件算法已在芯片内部用硬件电路实现,使用者只需给出输入数据,可在输出緛直接得到数据 185 | 186 | 187 | ### 数字信号处理的应用 188 | 189 | - 通信:GSM/蜂窝电话, CDMA; 190 | 191 | - 语音处理:语音编码、语音合戌、语音识别、语音坦强、语音邮件、语音储存等; 192 | 193 | - 图像/图形:二维和三维图形处理、图㑰压缩与传输、图㑰识别、动画、机器人视觉、多媒体、电子地图、图像增强等; 194 | 195 | - 军事:保密通信、雷达处理、声呐处理、导航、全球定位、跳频电台、搜索和反搜索等; 196 | 197 | - 仪器仪表: 频谱分析、函数发生、数据采集、地震处理等; 198 | 199 | - 自动控制:控制、深空作业、自动驾驶、机器人控制、磁盘控制等; 200 | 201 | - 医疗:助听、超声设备、诊断工具、病人监护、心电图等; 202 | 203 | - 家用电器:数宇音响、数宇电视、可视电话、音乐合成、音调控制、玩具与游戏 204 | -------------------------------------------------------------------------------- /digital-image-processing/VI/6.4 图像镜像.md: -------------------------------------------------------------------------------- 1 | # 图像镜像 2 | 3 | ## 6.4.1 图像镜像变换 4 | 5 | 图像的镜像变换不改变图像的形状。图像的镜像(Mirror)变换分为两种:一种是水平镜像,另外一种是垂直镜像。图像的水平镜像操作是将图像左半部分和右半部分以图像垂直中轴线为中心进行镜像对换;图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心进行镜像对换,如图6-16所示 6 | 7 | ![image-20230328152249588](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230328152249588.png) 8 | 9 | 图6-16 图像的镜像 10 | 11 | 图像的镜像变换也可以用矩阵变换表示。设点 $P_{0}\left(x_{0}, y_{0}\right)$ 进行镜像后的对应点为$P(x, y)$, 图像高度为 fHeight, 宽度为fWidth,原图像中 $P_0\left(x_0, y_0\right)$ 经过水平镜像后坐标将变为 (fWidth- $\left.x_0, y_0\right)$,其矩阵表达式为 12 | $$ 13 | \left[\begin{array}{l} 14 | x \\ 15 | y \\ 16 | 1 17 | \end{array}\right]=\left[\begin{array}{rrc} 18 | -1 & 0 & fWidth \\ 19 | 0 & 1 & 0 \\ 20 | 0 & 0 & 1 21 | \end{array}\right]\left[\begin{array}{l} 22 | x_{0} \\ 23 | y_{0} \\ 24 | 1 25 | \end{array}\right]\tag{6-3} 26 | $$ 27 | 28 | 逆运算矩阵表达式为 29 | 30 | $$ 31 | \left[\begin{array}{l} 32 | x_{0} \\ 33 | y_{0} \\ 34 | 1 35 | \end{array}\right]=\left[\begin{array}{ccc} 36 | -1 & 0 & fwidth \\ 37 | 0 & 1 & 0 \\ 38 | 0 & 0 & 1 39 | \end{array}\right]\left[\begin{array}{l} 40 | x \\ 41 | y \\ 42 | 1 43 | \end{array}\right] 44 | $$ 45 | 46 | 即 47 | 48 | $$ 49 | \left\{\begin{array}{l} 50 | x_{0}=f \text { Width }-x \\ 51 | y_{0}=y 52 | \end{array}\right. 53 | $$ 54 | 55 | 同样, $P_{0}\left(x_{0}, y_{0}\right)$ 经过垂直镜像后坐标将变为 $\left(x_{0}, f H e i g h t-y_{0}\right)$, 56 | 57 | 其矩阵表表达式为 58 | 59 | $$ 60 | \left[\begin{array}{l} 61 | x \\ 62 | y \\ 63 | 1 64 | \end{array}\right]=\left[\begin{array}{ccc} 65 | 1 & 0 & 0 \\ 66 | 0 & -1 & fHeight \\ 67 | 0 & 0 & 1 68 | \end{array}\right]\left[\begin{array}{l} 69 | x_{0} \\ 70 | y_{0} \\ 71 | 1 72 | \end{array}\right] 73 | \tag{6-4} 74 | $$ 75 | 76 | 逆运算矩阵表达式为 77 | 78 | $$ 79 | \left[\begin{array}{l} 80 | x_{0} \\ 81 | y_{0} \\ 82 | 1 83 | \end{array}\right]=\left[\begin{array}{ccc} 84 | 1 & 0 & 0 \\ 85 | 0 & -1 & \text { fHeight } \\ 86 | 0 & 0 & 1 87 | \end{array}\right]\left[\begin{array}{l} 88 | x \\ 89 | y \\ 90 | 1 91 | \end{array}\right] 92 | $$ 93 | 94 | 即 95 | 96 | $$ 97 | \left\{\begin{array}{l} 98 | x_{0}=x \\ 99 | y_{0}=f W i d t h-y 100 | \end{array}\right. 101 | $$ 102 | 103 | ## 6.4.2 图像镜像的算法 104 | 105 | 按照上面的变换公式 (6-3) 和(6-4),可以比较简单的实现图像的水平和垂直镜像操作, 读者可以参照6.3.2中平移的算法, 写出公式 (6-3) 和 (6-4) 对应的算法。 106 | 107 | 和图像平移一样, 在垂直镜像中也可以利用位图存储的连续性整行复制图像。下面将介绍采用这种方法的算法, 其主要算法如下, bDirection为真时表示水平镜像, 否则为垂直镜像。 108 | 109 | ```c++ 110 | //由图像位数确定的移动字节数nMovedBits 111 | //判断镜像方式 112 | if (bDirection) 113 | { 114 | //垂直中轴坐标 115 | int nMiddleX = nWidth / 2; 116 | //针对图像每行进行操作 117 | for(y = 0; y < nHeight; y++) 118 | { 119 | //指向图像的倒数第y行 120 | pOldTemp = pOldBits; 121 | pOldTemp += y * nWidthBytes; 122 | pNewTemp = pNewBits; 123 | pNewTemp += y * nWidthBytes; 124 | //针对每行图像左半部分进行操作 125 | for(x = 0; x <= nMiddleX; x++) 126 | { 127 | //将源图像第x个像素复制到新图像倒数第x个像素 128 | pTemp1 = pOldTemp + x * nMovedBits; 129 | pTemp2 = pNewTemp + (nWidth -1 - x) * nMovedBits; 130 | memcpy(pTemp2, pTemp1, nMovedBits); 131 | //将源图像倒数第x个像素复制到新图像第x个像素 132 | pTemp1 = pOldTemp + (nWidth -1 - x) * nMovedBits; 133 | pTemp2 = pNewTemp + x * nMovedBits; 134 | memcpy(pTemp2, pTemp1, nMovedBits); 135 | } 136 | } 137 | } 138 | else 139 | { 140 | //水平中轴坐标 141 | int nMiddleY = nHeight / 2; 142 | //针对上半图像进行操作 143 | for(y = 0; y <= nMiddleY; y++) 144 | { 145 | //指向源图像倒数第y行像素起点的指针 146 | pOldTemp = pOldBits; 147 | pOldTemp += y * nWidthBytes; 148 | //指向新图像第y行像素起点的指针 149 | pNewTemp = pNewBits; 150 | pNewTemp += (nHeight - 1 - y) * nWidthBytes; 151 | //将源图像倒数第y行像素复制到新图像第y行 152 | memcpy(pNewTemp, pOldTemp, nWidthBytes); 153 | //指向源图像第y行像素起点的指针 154 | pOldTemp = pOldBits; 155 | pOldTemp += (nHeight -1 -y) * nWidthBytes; 156 | //指向新图像倒数第y行像素起点的指针 157 | pNewTemp = pNewBits; 158 | pNewTemp += y * nWidthBytes; 159 | //将源图像第y行像素复制到新图像倒数第y行 160 | memcpy(pNewTemp, pOldTemp, nWidthBytes); 161 | } 162 | } 163 | //用新图像数据填充原图像数据区 164 | memcpy( pOldBits, pNewBits, nWidthBytes * nHeight ); 165 | 166 | ``` 167 | 168 | 169 | 170 | 171 | 172 | 图6-17 镜像前的图像 173 | 174 | 175 | 176 | 图6-18 水平镜像 177 | 178 | 179 | 180 | 图6-19 垂直镜像 -------------------------------------------------------------------------------- /digital-image-processing/V/5.5 非线性复原方法 .md: -------------------------------------------------------------------------------- 1 | # 5.5 非线性复原方法(仅供了解) 2 | 3 | ## 5.5.1 最大后验复原 4 | 5 | 最大后验复原是一种统计方法, 它把原图像 $f(x, y)$ 和退化图像 $g(x, y)$ 都作为随机场, 在已知 $g(x, y)$ 的前提下, 求出后验条件概率密度函数 $P(f(x, y) / g(x, y))$ 。若 $\hat{f}(x, y)$ 使式 6 | $$ 7 | \max _{f} p(f \mid g)=\max _f p(g \mid f) p(f) / p(g)=\max _f p(g \mid f) p(f)\tag{5-33} 8 | $$ 9 | 最大, 则 $\hat{f}(x, y)$ 就代表已知退化图像 $g(x, y)$ 时, 最可能的原始图像 $f(x, y)$ 。这种图像方法称之为最大后验图像复原方法。 10 | 11 | 最大后验图像复原方法把图像看作是非平稳随机场, 把图像模型表示成一个平稳随机过程对于一个不平稳的均值作零均值Gauss起伏, 可得出求解迭代序列: 12 | $$ 13 | \hat{f}_{k+1}=\hat{f}_k-h^* \sigma_n^{-2}\left(g-h^* \hat{f}_k\right)-\sigma_n^{-2}\left(\hat{f}_k-\bar{f}\right)\tag{5-34} 14 | $$ 15 | 其中, $k$ 为迭代次数, $\sigma_n^{-2}$ 和 $\sigma_f^{-2}$ 分别为 $f$ 和 $n$ 的方差的倒数, $f$ 是随空间而变的均值, 它是一个常数, 但要经过多次迭代才能收敛到最后的解。 16 | 17 | ## 5.5.2 最大熵复原 18 | 19 | 最大熵复原方法是通过最大化某种反映图像平滑性的准则函数来作约束条件, 以解决图像复原中反向滤波法存在的病态问题。 20 | 首先简单介绍一下熵的概念。 21 | 熵的定义为 22 | $$ 23 | H=-\int_{-\infty}^{+\infty} P(x) \ln P(x) d x\tag{5-35} 24 | $$ 25 | 式中, $P(x)$ 为随机变量 $x$ 的概率密度。 26 | 对于离散信号, 熵的定义为 27 | $$ 28 | H=-\sum_{k=1}^M P(k) \ln P(k)\tag{5-36} 29 | $$ 30 | 熵是表征随机变量集合的随机程度的量度。当所有随机变量等可能性时, 也就是说 $P_1=P_2=\ldots=P_{m}$ 时熵最大, 为 $H=\ln M$ 。由于概率 $P(k)$ 介于 $0 \sim 1$ 之间, 因此最大熵的范围为 $0 \sim \ln M, H$ 不可能出现负值。 31 | 在二维数字图像中, 熵的定义为 32 | $$ 33 | H_f=-\sum_{m=1}^M \sum_{n=1}^N f(m, n) \ln f(m, n)\tag{5-37} 34 | $$ 35 | 最大熵复原的原理是将 $f(x, y)$ 写成随机变量的统计模型,然后在一定的约束条件下,找出用随机变量形式表示的熵的表达式, 运用求极大值的方法, 求得最优估计解 $\hat{f}(x, y)$ 。最大熵复原的含义是对 $\hat{f}(x, y)$ 的最大平滑估计。 最大熵复原常用Friend和Burg两种方法, 这两种方法基本原理相同, 这里仅介绍Friend法。 36 | 37 | 首先定义一幅大小为 $M \times N$ 的图像 $f(x, y)$, 显然 $f(x, y)$ 非负。 图像的总能量 $E$ 和熵分别为 38 | $$ 39 | E=\sum_{i=j}^M \sum_{j=1}^N f\left(x_i, y_j\right)\tag{5-38} 40 | $$ 41 | 和 42 | $$ 43 | H_f=\sum_{i=j}^M \sum_{j=1}^N f\left(x_i, y_j\right) \operatorname{lnf}\left(x_i, y_j\right)\tag{5-39} 44 | $$ 45 | 类似地可定义噪声的熵 $H_n$ : 46 | $$ 47 | H_n=-\sum_{i=1}^M \sum_{j=1}^N n^{\prime}\left(x_i, y_j\right) 1 n n^{\prime}\left(x_i, y_j\right)\tag{5-40} 48 | $$ 49 | 式中: $n^{\prime}(x, y)=n(x, y)+B, B$ 为最大噪声负值。 50 | 51 | 恢复就是在满足式(5-38) 和图像退化模型的约束条件下, 使恢复后的图像熵和噪声熵达到最大。熵通常取决于 $f$ 的形状, 当图像具有均匀的灰度时熵最大。因此用最大熵恢复图像具有某种平滑性。 52 | 引入拉格朗日 (Lagrange) 函数 53 | $$ 54 | \begin{aligned} 55 | R & =H_f+\rho H_n+\sum_{m=1}^N \sum_{n=1}^N \lambda_{m m}\left\{\sum_{x=1}^N \sum_{n=1}^N h(m-x, n-y) f(x, y)+n_T(m, n)-B-g(m, n)\right. \\ 56 | & +\beta\left\{\sum_{x=1}^N \sum_{y=1}^N f(x, y)-E\right\} 57 | \end{aligned}\tag{5-41} 58 | $$ 59 | 式中: $\lambda_{m n}(m, n=1,2, \ldots, N)$ 和 $\beta$ 是拉格朗日乘子, $\rho$ 是加权因子,表示 $H_f$ 和 $H_n$ 相互之间的权重。 60 | 61 | $\hat{f}(x, y)$ 和 $\hat{n}(m, n)$ 分别表示 $f(x, y)$ 和 $n^{\prime}(x, y)$ 的估计值, 则有 62 | $$ 63 | \frac{\partial R}{\partial f(x, y)}=0 \tag{5-42} 64 | $$ 65 | 66 | $$ 67 | \frac{\partial R}{\partial n^{\prime}(x, y)}=0\tag{5-43} 68 | $$ 69 | 把式(5-41)分别代入式(5-42)和式(5-43), 可得 70 | $$ 71 | \hat{f}(x, y)=\exp \left[-1+\beta+\sum_{m=1}^N \sum_{n=1}^N \lambda_{m m} h(m-x, n-y)\right] \quad x, y=1,2, \ldots, N \tag{5-44} 72 | $$ 73 | $$ 74 | \hat{n}(m, n)=\exp \left(-1+\frac{\lambda_{m n}}{\rho}\right) \quad \quad m, n=1,2, \ldots, N\tag{5-45} 75 | $$ 76 | 77 | 并且$\hat{f}(x,y)$和$\hat{n}(m,n)$满足下列约束条件 78 | $$ 79 | \sum_{x=1}^N \sum_{y=1}^N f(x, y)=E\tag{5-46} 80 | $$ 81 | 82 | $$ 83 | \sum_{x=1}^N \sum_{y=1}^N h(m-x, n-y) f(x, y)+\hat{n}(m, n)-\beta=g(m, n)\tag{5-47} 84 | $$ 85 | 86 | 式(5-44)为图像恢复函数。把式(5-44)和式(5-45)代入式(5$46)$ 和式(5-47)可得 $\left(N^2+1\right)$ 个方程。由此联立方程组可解得 $\left(N^2+1\right)$ 个末知数解 $\lambda_{m n}(m, n=1,2, \ldots, N)$, 解上述方程组可求得 $\hat{f}(x, y)$ 的值。 87 | 88 | ## 投影复原 89 | 90 | 投影复原法是用代数方程组来描述线性和非线性退化系统的。该系统可用下式描述: 91 | $$ 92 | g(x, y)=H[f(x, y)]+n(x, y) 93 | $$ 94 | 其中: $f(x, y)$ 是原始图像, $g(x, y)$ 是退化图像, $n(x, y)$ 是系统噪声, $H$ 是退化算子,表示对图像进行某种运算。 95 | 在使用投影复原法进行图像复原时, 引进一些先验信息附加的约束条件, 可改善图像复原效果。 96 | 97 | ### 投影复原法 98 | 99 | $$ 100 | g(x, y)=H[f(x, y)]+n(x, y) 101 | $$ 102 | 投影复原方法就是迭代方法之一。设初始估值 $f^0(x, y)$, 然后进行迭代运算. 103 | 设 $f^0(x, y)=g(x, y)$ 104 | 设 $H$ 是非线性的, 并忽略噪声, 则上式写成: 105 | $$ 106 | \begin{array}{ll} 107 | a_{11} f_1+a_{12} f_2+\ldots & a_{1 N} f_N=g_1 \\ 108 | a_{21} f_1+a_{22} f_2+\ldots & a_{2 N} f_N=g_2 \\ 109 | \ldots & \\ 110 | a_{M 1} f_1+a_{M 2} f_2+\ldots & a_{M N} f_N=g_M 111 | \end{array}\tag{5-48} 112 | $$ 113 | $$ 114 | f=\left[f_1 \ldots f_N\right] 115 | $$ 116 | 取 117 | $$ 118 | f^{(0)}=\left[f_1^{(0)}, f_2^{(0)}, \ldots f_N^{(0)}\right] 119 | $$ 120 | $$ 121 | f^{(0)}=\left[g_1, g_2, \ldots g_N\right] 122 | $$ 123 | $f^{(1)}$ 取 $f^{(0)}$ 在第一个超平面$a_{11} f_1+a_{12} f_2+\ldots \quad a_{1 N} f_{N}=g_1$上的投影。 124 | 125 | 即: 126 | 127 | $$ 128 | f^{(1)}=f^{(0)}-\frac{f^{(0)} \cdot a_1-g_1}{a_1 \bullet a_2} a_1\tag{5-49} 129 | $$ 130 | 131 | $f^{(2)}$ 取 $f^{(1)}$ 在第二个超平面$a_{21} f_1+a_{22} f_2+\ldots \quad a_{2 N} f_{N}=g_2$ 上的投影。 132 | 133 | 依次继续下去, 直到满足 $( 5 . 4 8 )$ 式中最后一个方程式。这就实现了迭代的第一个循环然后再从 (5.48)式中第一个方程式开始第二次迭代。即取 $f^{(M)}$ 在第一个超平面$a_{11} f_1+a_{12} f_2+\ldots a_{1 N} f_{N}=g_1$上的投影。并称之为 $f^{(M+1)}$ 。依次继续, 直到 134 | $$ 135 | f^{(k+1)}=f^{(k)}\tag{5-50} 136 | $$ 137 | 则: 138 | $$ 139 | f^{(k)}=f\tag{5-51} 140 | $$ 141 | -------------------------------------------------------------------------------- /digital-image-processing/VIII/8.4 形态学的应用.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 8.4 形态学的应用 4 | 5 | ## 8.4.1 形态学滤波 6 | 7 | 由于开、闭运算所处理的信息分别与图像的凸、凹处相关,因此,它们本身都是单边算子,可以利用开、闭运算去除图像的噪声、恢复图像,也可交替使用开、闭运算以达到双边滤波目的。一般,可以将开、闭运算结合起来构成形态学噪声滤波器,例如 $(X \circ S) \bullet S$ 或 $(X \bullet S) \circ S$ 等。 8 | 9 | 图8-23给出消除噪声的一个图例。图8-23(a)包括一个长方形的目标 $X$, 由于噪声的影响在目标内部有一些噪声孔而在目标周围有一些噪声块。现在用图8-23(b)所示的结构元素S通过形态学操作来滤除噪声, 这里的结构元素应当比所有的噪声孔和块都要大。先用 $S$ 对 $X$ 进行腐蚀得到图8-23(c), 再用 $S$ 对腐蚀结果进行膨胀得到图8-23(d), 这两个操作的串行结合就是开运算, 它将目标周围的噪声块消除掉了。再用 $S$ 对图8-23(d)进行一次膨胀得到图8-23(e), 然后用 $S$ 对膨胀结果进行腐蚀得到图8-23(f), 这两个操作的串行结合就是闭运算, 它将目标内部的噪声孔消除掉了。整个过程是先做开运算再做闭运算, 可以写为 10 | 11 | $$ 12 | \{[(X \ominus S) \oplus S] \oplus S\} \ominus S=(X \circ S) \bullet S 13 | $$ 14 | 15 | ![image-20230404150128958](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404150128958.png) 16 | 17 | 图8-23 形态学滤波示意图 18 | 19 | 比较图8-23(a)和 (f), 可看出目标区域内外的噪声都消除掉了, 而目标本身除原来的4个直角变为圆角外没有太大的变化。 在利用开、闭运算滤除图像的噪声时, 选择圆形结构元素会得到较好的结果。为了能使从噪声污染的图像 $X$ 中恢复原始图像 $X_{0}$ 的结果达到最优, 在确定结构元素的半径时, 可以采用优化方法。为了达到这一目的, 可将图像和噪声视为随机过程, 通过统计优化分析得到优化结果。 20 | 21 | 相似的方法也可以应用于灰值图像处理。灰值开运算可用于过滤最大噪声(高亮度噪声), 因为被滤掉的噪声位于信号的上方。 如果将图8-20信号上方的尖峰视为噪声, 那么, 灰值开运算后可得到很好的滤波效果, 如图8-20(c)所示。根据对偶性, 闭运算可以滤掉信号下方的噪声尖峰。图8-20(d)给出了利用圆形结构元素进行灰值闭滤波的结果。与二值情况相似, 可以利用适当的结构元素进行开-闭滤波, 并且适当地选择结构元素的尺寸是非常关键的。此外, 如果信号中还混杂有不同尺寸的噪声脉冲, 并且噪声之间并没有很好地分离, 那么, 可以选用一种交变序列滤波器, 这种滤波器使用逐渐增加宽度的结构元素交替地做灰值开、闭运算。在一般情况下, 噪声往往由信号上下凸起的尖峰组成。只要这些噪声是很好分离的, 就可以利用开运算和闭运算的迭代运算或闭运算和开运算的迭代运算将其消除。 22 | 23 | ## 8.4.2 骨架抽取 24 | 25 | 把一个平面区域简化成图(Graph)是一种重要的结构形状表示法。利用细化技术得到区域的细化结构是常用的方法。因此, 寻找二值图像的细化结构是图像处理的一个基本问题。在图像识别或数据压缩时, 经常要用到这样的细化结构, 例如,在识别字符之前, 往往要先对字符作细化处理, 求出字符的细化结构。骨架便是这样的一种细化结构, 它是目标的重要拓扑描述,具有非常广泛的应用。 26 | 27 | 下面首先对数字图像细化概念做简要介绍。许多数学形态学算法都依赖于击中/击不中变换。其中数字图像细化, 便是一种最常见的使用击中/击不中变换的形态学算法。对于结构对 $B=\left(B_{1}\right.$, $\left.B_{2}\right)$ , 利用 $B$ 细化 $X$ 定义为 28 | 29 | $$ 30 | X \otimes B=X-(X \ominus B) 31 | $$ 32 | 33 | 即 $X \otimes B$ 为 $X$ 与 $X \ominus B$ 的差集。更一般地, 利用结构对序列 $B^{1} , B^{2}$ ,.., $B^{N}$ 迭代地产生输出序列 34 | 35 | $$ 36 | X^{1}=X \otimes B^{1}, X^{2}=X^{1} \otimes B^{2}, \Lambda, X^{N}=X^{N-1} \otimes B^{N} 37 | $$ 38 | 39 | 或者 40 | 41 | $$ 42 | \left\{X^{i}\right\}=X \otimes\left\{B^{i}\right\}=\left(\Lambda\left(\left(X \otimes B^{1}\right) \otimes B^{2}\right) \Lambda B^{N}\right) \quad i=1,2, \ldots, N 43 | $$ 44 | 45 | 随着迭代的进行, 得到的集合也不断细化。假设输入集合是有限的 (即 $N$ 为有限), 最终将得到一个细化的图像。结构对的选择仅受结构元素不相交的限制。事实上, 每一个 $B^{i}(i=1,2, \ldots$, $N$ )都可以是相同的结构对, 即在不断重复的迭代细化过程使用同一个结构对。在实际应用中, 通常选择一组结构元素对, 迭代过程不断在这些结构对中循环,当一个完整的循环结束时, 如果所得结果不再变化, 则终止迭代过程。 46 | 47 | 骨架还可以用中轴表示。设想在 $t=0$ 时刻, 将目标边界各处同时点燃, 火的前沿以匀速向目标内部萝延, 当前沿相交时火焰熄灭, 火焰熄灭点的集合就构成了中轴。图8-24(a) 是这个过程的图示。另外一种定义骨架的方法使用了最大圆盘概念:目标X的骨架由 $X$ 内所有最大内切圆盘的圆心组成, 如图8-24(b)、(c) 所示。最大圆盘不是其他任何完全属于 $X$ 的圆盘的子集, 并且至少有两点与目标边界轮廓相切。骨架的每个点都对应一个相应的最大圆盘和半径 $r$ 。最大圆盘定义的骨架与火种方式定义的骨架除在某些特殊情况下端点处存在差异外, 绝大多数情况下都是一致的。 48 | 49 | ![image-20230404150234408](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404150234408.png) 50 | 51 | 图8-24 骨架的定义 52 | 53 | 按照最大圆盘定义骨架的方式, 在欧氏二值图像的内部任意给定一点, 如果以该点为圆心存在一个最大圆盘, 其整个盘体都在图像的内部, 且至少有两点与目标边界相切, 则该点便是骨架上的点。所有最大圆盘的圆心构成了图像的骨架(中轴)。 对于图像 $X$, 一般用 $S(X)$ 表示其骨架。注意, 不同的图像可能有相同的骨架。骨架对噪声非常敏感, 而且连通的集合可能具有不连通的骨架(例如两个相切圆盘的骨架)。 54 | 55 | 数字骨架可以从形态学的角度进行定义。对于 $k=0,1$, $2 , \ldots$, 定义骨架子集 $S_{k}(X)$ 为图像 $X$ 内所有最大圆盘 $k B$ 的圆心 $x$ 构成的集合。从骨架的定义可知, 骨架是所有骨架子集的并, 即 56 | 57 | $$ 58 | S(X)=\cup\left\{S_{k}(X) \mid k=0,1,2, \ldots\right\} 59 | $$ 60 | 61 | 可以证明骨架子集为 62 | 63 | $$ 64 | S_{k}(X)=(X \ominus k B)-[(X \ominus k B) \circ B] 65 | $$ 66 | 67 | 式中, $B$ 为结构元素, $(X \ominus k B)$ 代表连续 $k$ 次用 $B$ 对 $X$ 腐蚀, 即 68 | 69 | $$ 70 | (X \ominus k B)=((\ldots(X \ominus B) \ominus B) \ldots) \ominus B 71 | $$ 72 | 73 | 由此式和式 (8-33) 可得 74 | 75 | $$ 76 | S(X)=\cup\{(X \ominus k B)-[(X \ominus k B) \circ B] \mid k=0,1,2, \ldots\} 77 | $$ 78 | 79 | 这就是骨架的形态学表示, 它也是用数学形态学方法提取图像骨架技术的依据。对于给定的图像X以及结构元素 $B$, $(X \ominus k B)$ 可以将 $X$ 腐蚀为空集, 如果用 $N$ 表示 $(X \ominus k B)$ 运算将 $X$ 腐蚀成空集前的最后一次迭代次数, 即 80 | 81 | $$ 82 | N=\max \{k \mid(X \ominus k B) \neq \phi\} 83 | $$ 84 | 85 | 则式 (8-34)可以写为 86 | 87 | $$ 88 | S(X)=\overset{N}{\underset{k=0}{Y}}\{(X\ominus kB)-[(X\ominus kB )\circ B]\} 89 | $$ 90 | 91 | 相反,图像$X$也可以用 $S_{k}(X)$ 重构, 即 92 | 93 | $$ 94 | X=\overset{N}{\underset{k=0}Y} 95 | \left\{S_{k}(X) \oplus k B\right\} 96 | $$ 97 | 98 | 式中, $B$ 为结构元素, $\left(S_{k}(X) \oplus k B\right)$ 代表连续 $k$ 次用 $B$ 对 $S_{k}(X)$膨胀, 即 99 | 100 | $$ 101 | \left(S_{k}(X) \oplus k B\right)=\left(\left(\Lambda\left(S_{k}(X) \oplus B\right) \oplus B\right) \oplus \Lambda\right) \oplus B 102 | $$ 103 | 104 | 利用式(8-35)以及图像腐蚀、膨胀的算法可以编写程序实现形态学骨架抽取变换, 有兴趣的读者请参考书后的参考文献。图8-25给出了用形态学方法抽取图像骨架的一个实例。其中, 图 8-25(a)为一幅二值图像, 图8-25(b)为用 $3 \times 3$ 的结构元素 $S$ (原点在中心)得到的骨架, 图8-25(c)为用 $5 \times 5$ 的结构元素得到的骨架,图8-25(d)为用 $7 \times 7$ 的结构元素得到的骨架。注意图8-25(c)和(d)中由于模板较大叶柄没有保留下来。 105 | 106 | ![image-20230404150714049](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404150714049.png) 107 | 108 | 图8-25 骨架抽取示例 109 | (a) 一幅二值图像; (b) 用3×3的结构元素S得到的骨架; 110 | (c) 用5×5的结构元素得到的骨架; (d)用5×5的结构元素得到的骨架 -------------------------------------------------------------------------------- /digital-signal-processing/14.FIR数字滤波器的基本结构.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # FIR数字滤波器的基本结构 4 | 5 | ## FIR数字滤波器的特点 6 | 7 | 系统函数: 8 | $$ 9 | H(z)=\sum_{n=0}^{N-1} h(n) z^{-n} 10 | $$ 11 | 12 | 有 $N-1$ 个零点分布于 $z$ 平面 13 | 14 | $z=0$ 处是 $N-1$ 阶极点 15 | 16 | 17 | 18 | 1) 系统的单位抽样响应 $h(n)$ 有限长, 设 $N$ 点 19 | 20 | 2) 系统函数 $H(z)$ 在 $|z|>0$ 处收敛, 有限 $z$ 平面只有零点, 全部极点在 $z=0$ 处 (因果系统) 21 | 22 | 3) 无输出到输入的反馈, 一般为非递归型结构 23 | 24 | $$ 25 | H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_{k=0}^{M} b_{k} z^{-k}}{1-\sum_{k=1}^{N} a_{k} z^{-k}} \\ 26 | H(z)=\sum_{n=0}^{N-1} h(n) z^{-n}\\ 27 | y(n)=\sum_{k=1}^{N} a_{k} y(n-k)+\sum_{k=0}^{M} b_{k} x(n-k)\\ 28 | y(n)=\sum_{m=0}^{N-1} h(m) x(n-m) 29 | $$ 30 | 31 | 32 | 33 | ### 直接型 (横截型、卷积型) 34 | 35 | 差分方程 36 | $$ 37 | \quad y(n)=\sum_{m=0}^{N-1} h(m) x(n-m) 38 | $$ 39 | FIR滤波器的横截型结构 40 | 41 | ![](https://cdn.mathpix.com/cropped/2022_07_17_392c01436de7a6a12b6dg-36.jpg?height=180&width=886&top_left_y=465&top_left_x=366) 42 | 43 | FIR滤波器的转置结构 44 | 45 | ![](https://cdn.mathpix.com/cropped/2022_07_17_392c01436de7a6a12b6dg-36.jpg?height=140&width=1076&top_left_y=734&top_left_x=332) 46 | 47 | ### 级联型 48 | 49 | 将 $H(z)$ 分解成实系数二阶因式的乘积形式: 50 | 51 | $$ 52 | &H(z)=\sum_{n=0}^{N-1} h(n) z^{-n}=\prod_{k=1}^{[N / 2]}\left(\beta_{0 k}+\beta_{1 k} z^{-1}+\beta_{2 k} z^{-2}\right) \\ 53 | $$ 54 | 55 | FIR滤波器的级联型浯枃(N为奇数) 56 | 57 | ![image-20220719192658342](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20220719192658342.png) 58 | 59 | $N$ 为偶数时, 其中有一个 $\beta_{2 k}=0 \quad(N-1$ 个零点 $)$ 60 | 61 | 级联型的特点 62 | 63 | - 每个基本节控制一对零点,,便于控制滤波器的传输零点 64 | 65 | - 系数比直接型多,所需的乘法运算多 66 | 67 | ### 频率抽样型 68 | 69 | $N$ 个频率抽样 $H(k)$ 恢复 $H(z)$ 的内插公式: 70 | 71 | $$ 72 | \begin{aligned} 73 | H(z) &=\left(1-z^{-N}\right) \frac{1}{N} \sum_{k=0}^{N-1} \frac{H(k)}{1-W_{N}^{-k} z^{-1}} \\ 74 | &=\frac{1}{N} H_{c}(z) \sum_{k=0}^{N-1} H_{k}^{\prime}(z) 75 | \end{aligned} 76 | $$ 77 | 78 | 又名梳状滤波器,示意图如下 79 | 80 | ![](https://cdn.mathpix.com/cropped/2022_07_17_392c01436de7a6a12b6dg-40.jpg?height=312&width=602&top_left_y=562&top_left_x=273) 81 | 82 | #### 子系统 83 | 84 | $$ 85 | H_{c}(z)=1-z^{-N} 86 | $$ 87 | 88 | 是 $N$ 节延时单元的梳状滤波器 89 | 90 | 在单位圆上有 $N$ 个等间隔角度的零点: 91 | 92 | $$ 93 | z_{k}=e^{j \frac{2 \pi}{N} k} \quad k=0,1, \ldots, N-1 94 | $$ 95 | 96 | 97 | - 频率响应 : 98 | 99 | $$ 100 | \begin{aligned} 101 | H_{c}\left(e^{j \omega}\right)&=1-e^{-j \omega N} \\ 102 | &=e^{-j \frac{\omega N}{2}}\left(e^{j \frac{\omega N}{2}}-e^{-j \frac{\omega N}{2}}\right) \\ 103 | &=2 j e^{-j \frac{\omega N}{2}} \sin \frac{\omega N}{2} 104 | \end{aligned} 105 | $$ 106 | 107 | #### 子系统 108 | 109 | $$ 110 | H_{k}^{\prime}(z)=\frac{H(k)}{1-W_{N}^{-k} z^{-1}} 111 | $$ 112 | 113 | 谐振器 114 | 115 | 单位圆上有一个极点 116 | $$ 117 | z_{k}=W_{N}^{-k}=e^{j \frac{2 \pi}{N} k} 118 | $$ 119 | 120 | 与第 $k$ 个零点相抵消, 使该频率 $\omega=\frac{2 \pi}{N} k$ 处的频率响应等于 $H(k)$ 121 | 122 | $$ 123 | H(z)=\left(1-z^{-N}\right) \frac{1}{N} \sum_{k=0}^{N-1} \frac{H(k)}{1-W_{N}^{-k} z^{-1}} 124 | $$ 125 | 126 | FIR滤波器的频率抽样型结构 127 | 128 | ![image-20220719193151999](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20220719193151999.png) 129 | 130 | #### 频率抽样型结构的优缺点 131 | 132 | 调整 $H(k)$ 就可以有效地调整频响特性 133 | 134 | - 若 $h(n)$ 长度相同, 则网络结构完全相同, 除了各支路增益 $H(k)$, 便于标准化、模块化 135 | 136 | - 有限字长效应可能导致零极点不能完全对消, 导致系统不稳定 137 | 138 | - 系数多为复数, 增加了复数乘法和存储量 139 | 140 | 141 | 142 | #### 快速卷积结构 143 | 144 | FIR滤波器的快速卷积结构 145 | 146 | 147 | 148 | #### 线性相位FIR滤波器的结构 149 | 150 | $\mathrm{FIR}$ 滤波器单位抽样响应 $h(n)$ 为实数, $0 \leq n \leq N-1$ 且满足: 151 | 152 | 偶对称: 153 | 154 | $$ 155 | h(n)=h(N-1-n) 156 | $$ 157 | 158 | 或奇对称: 159 | $$ 160 | h(n)=-h(N-1-n) 161 | $$ 162 | 即对称中心在 $(N-1) / 2$ 处 163 | 164 | 则这种FIR滤波器具有严格线性相位。 165 | 166 | - $N$ 为奇数 167 | 168 | $$ 169 | \begin{aligned} 170 | H(z) &=\sum_{n=0}^{N-1} h(n) z^{-n} \\ 171 | &=\sum_{n=0}^{\frac{N-1}{2}-1} h(n) z^{-n}+h\left(\frac{N-1}{2}\right) z^{-\frac{N-1}{2}}+\sum_{n=\frac{N-1}{2}+1}^{N-1} h(n) z^{-n} \\ 172 | \end{aligned} 173 | $$ 174 | 175 | 令 $n=N-1-m$ 176 | $$ 177 | H(z)=\sum_{n=0}^{\frac{N-1}{2}-1} h(n)\left[z^{-n} \pm z^{-(N-1-n)}\right]+h\left(\frac{N-1}{2}\right) z^{-\frac{N-1}{2}} 178 | $$ 179 | N为奇数时线性相位FIR滤波器的直接型结构 180 | 181 | ![](https://cdn.mathpix.com/cropped/2022_07_17_392c01436de7a6a12b6dg-47.jpg?height=374&width=1186&top_left_y=174&top_left_x=138) 182 | 183 | $h(n)$ 偶对称,取 “+” 184 | 185 | $h(n)$ 奇对称, 取“ -", 且 $h\left(\frac{N-1}{2}\right)=0$ 186 | 187 | - $N$ 为偶数 188 | 189 | $$ 190 | \begin{aligned} 191 | H(z) &=\sum_{n=0}^{N-1} h(n) z^{-n}=\sum_{n=0}^{\frac{N}{2}-1} h(n) z^{-n}+\sum_{n=\frac{N}{2}}^{N-1} h(n) z^{-n} \\ 192 | &=\sum_{n=0}^{\frac{N}{2}-1} h(n)\left[z^{-n} \pm z^{-(N-1-n)}\right] 193 | \end{aligned} 194 | $$ 195 | 196 | N为偶数时,线性相位FIR滤波器的直接型结构 197 | 198 | $h(n)$ 偶对称时,$\pm 1$ 取 $+1$ ,$h(n)$ 奇对称时 $\pm 1$ 取 $-1$ 199 | 200 | ![image-20220719193700455](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20220719193700455.png) -------------------------------------------------------------------------------- /digital-image-processing/III/3.5 LZW编码 .md: -------------------------------------------------------------------------------- 1 | # 3.5LZW编码 2 | 3 | ## 3.5.1LZW编码方法 4 | 5 | LZW(Lempel-Ziv&Welch)编码又称字串表编码,属于一种无损编码,是Welch将Lempel和Ziv所提出的无损压缩技术改进后的压缩方法。LZW编码与行程编码类似,也是对字符串进行编码从而实现压缩,但它在编码的同时还生成了特定字符串以及与之对应的索引字符串表。 6 | 7 | LZW编码的基本思想是:在编码过程中,将所遇到的字符串建立一个字符串表,表中的每个字符串都对应一个索引,编码时用该字符串在字串表中的索引来代替原始的数据串。例如,一幅8位的灰度图像,我们可以采用12位来表示每个字符串的索引,前256个索引用于对应可能出现的256种灰度,由此可建立一个初始的字符串表,而剩余的3840个索引就可分配给在压缩过程中出现的新字符串,这样就生成了一个完整的字符串表,压缩数据就可以只保存它在字符串表中的索引,从而达到压缩数据的目的。字符串表是在压缩过程中动态生成的,不必将它保存在压缩文件里,因为解压缩时字符串表可以由压缩文件中的信息重新生成。 8 | 9 | GIF(GraphicsInterchangeFormat)最初是由美国CompuServe于1987年开发的一种压缩位图格式。它可支持多达256种的颜色,具有极佳的压缩效率,已成为Internet上一种流行的文件格式。GIF图像文件采用的是一种改良的LZW压缩算法,通常称为GIF-LZW压缩算法。GIF图像文件以块(又称为区域结构)的方式来存储图像相关的信息,具体的文件格式可参考图像文件格式的相关书籍。下面简要介绍GIF-LZW的编码方法。 10 | 11 | 设S1、S2为两个存放字符串的临时变量,LZW_CLEAR和LZW_EOI分别为字符表初始化标志和编码结束标志,GIF-LZW的编码步骤如下: 12 | 13 | (1)根据图像中使用的颜色数初始化一个字串表,字串表中的每个颜色对应一个索引。在初始字串表的末尾再添加两个符号(LZW_CLEAR和LZW_EOI)的索引。设置字符串变量S1、S2并初始化为空。 14 | 15 | (2)接着输出LZW_CLEAR在字串表中的索引。 16 | 17 | (3)从图像数据流中第一个字符(假设数据以字符串表示)开始,每次读取一个字符,将其赋给字符串变量S2。 18 | 19 | (4)判断“S1+S2”是否已存在于字串表中。如果字串表中存在“S1+S2”,则S1=S1+S2;否则,输出S1在字串表中的索引,并在字串表末尾为“S1+S2”添加索引,同时,S1=S2。 20 | 21 | (5)重复第3和第4步,直到所有字符读完为止。 22 | 23 | (6)输出S1中的字符串在字串表中的索引,然后输出结束标志LZW_EOI的索引,编码完毕。 24 | 25 | GIF-LZW的解码过程比较复杂,它和编码过程正好相反,即将编码后的码字转换成对应的字符串,重新生成字串表,然后依次输出对应的字符串即可。GIF-LZW的解码流程如图3-2所示,表中的Code和OldCode是两个存放索引的临时变量。 26 | 27 | ![image-20230419200728712](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419200728712.png) 28 | 29 | 图3-2GIF-LZW解码流程 30 | 31 | ## 3.5.2LZW编码实例 32 | 33 | 设有一来源于4色(以a、b、c、d表示)图像的数据流aabcabbbbd,现对其进行LZW编码。编码过程如下: 34 | 编码前,首先需要初始化一个字符串表。由于图像中只有四种颜色,因而我们可以只用4比特表示字符串表中每个字符串的索引,表中的前4项代表4种颜色,后两项分别表示初始化和图像结束标志,建立的初始化字符串表如表3-5所示。接着把S1和S2初始化为空(即NULL),输出LZW_CLEAR的在字符串表中的索引值4H,接下来是对图像数据的编码。 35 | 36 | 表3-5初始化字符串表 37 | $$ 38 | \begin{array}{|c|c|} 39 | \hline \text{字符串}&\text{索引}\\ 40 | \hline a&0H\\ 41 | \hline b&1H\\ 42 | \hline c&2H\\ 43 | \hline d&3H\\ 44 | \hline \text{LZW\_CLEAR}&4H\\ 45 | \hline \text{LZW\_EOI}&5H\\ 46 | \hline 47 | \end{array} 48 | $$ 49 | 50 | 51 | 读取图像数据流的第一个字符“a”,赋给S2,因S1+S2=“a”已存在字串表中,所以S1=S1+S2=“a”。 52 | 接着读入下一个字符“a”赋给S2,因S1+S2=“aa”不存在于字串表中,所以输出S1=“a”的索引0H,同时在字符串表末尾添加新字符串“aa”的索引6H,并使S1=S2=“a”。 53 | 依次读取数据流中的每个字符,如果S1+S2没有出现在字符串表中,则输出S1中的字符串的索引,并在字符串表末尾为新字符串S1+S2添加索引,并使S1=S2;否则,不输出任何结果,只是使S1=S1+S2。所有字符处理完毕后,输出S1中的字符串的索引,最后输出结束标志LZW_EOI的索引。至此,编码完毕,完整的编码过程如表3-6所示,最后的编码结果为“4001271B35”(以十六进制表示)。 54 | 55 | 表3-6GIF-LZW编码过程 56 | $$ 57 | \begin{array}{|c|c|c|c|c|} 58 | \hline \text { 输入数据 S2 } & \text { S1+S2 } & \text { 输出结果 } & \text { S1 } & \text { 生成的新字符串及索引 } \\ 59 | \hline \text { NULL } & \text { NULL } & 4 H & \text { NULL } & \\ 60 | \hline a & a & & a & \\ 61 | \hline a & aa & 0 H & a & aa<6 H> \\ 62 | \hline b & ab & 0 H & a & ab<7 H> \\ 63 | \hline c & bc & 1 H & c & ca<9 H> \\ 64 | \hline a & ca & 2 H & a & \\ 65 | \hline b & ab & & ab & abb \\ 66 | \hline b & abb & 7 H & b & bb \\ 67 | \hline b & bb & 1 H & b & \\ 68 | \hline b & bb & & bb & bbd \\ 69 | \hline d & bbd & BH & d & \\ 70 | \hline & & 3 H & & \\ 71 | \hline & & 5 H & & \\ 72 | \hline 73 | \end{array} 74 | $$ 75 | 下面对上述编码结果“4001271B35”进行解码。按图3-2的解码流程,首先读取第一个编码Code=4H,由于它为LZW_CLEAR,因此需初始化字符串表,结果如表3-5所示(在实际应用中,可根据文件头中给定的信息建立初始字符串表)。 76 | 77 | 读入下一个编码Code=0H,由于它不等于LZW_CLEAR,因此输出字串表中0H对应的字符串“a”,同时使OldCode=Code=0H。 78 | 79 | 读入下一个编码Code=0H,由于字串表中存在该索引,因此输出0H所对应的字符串“a”,然后将OldCode=0H所对应的字符串“a”加上Code=0H所对应的字符串的第一个字符“a”,即“aa”添加到字串表中,其索引为6H,同时使ldCode=Code=0H。 80 | 81 | 读入下一个编码Code=1H,由于字串表中存在该索引,因此输出1H所对应的字符串“b”,然后将OldCode=0H所对应的字符串“a”加上Code=1H所对应的字符串的第一个字符“b”,即“ab”添加到字串表中,其索引为7H,同时使OldCode=Code=1H。 82 | 83 | 读入下一个编码Code=2H,由于字串表中存在该索引,因此输出2H所对应的字符串“c”,然后将OldCode=1H所对应的字符串“b”加上Code=2H所对应的字符串的第一个字符“c”,即“bc”添加到字串表中,其索引为8H,同时使OldCode=Code=2H。 84 | 85 | 读入下一个编码Code=7H,由于字串表中存在该索引,因此输出7H所对应的字符串“ab”,然后将OldCode=2H所对应的字符串“c”加上Code=7H所对应的字符串的第一个字符“a”,即“ca”添加到字串表中,其索引为9H,同时使OldCode=Code=7H。 86 | 87 | 读入下一个编码Code=1H,由于字串表中存在该索引,因此输出1H所对应的字符串“b”,然后将OldCode=7H所对应的字符串“ab”加上Code=1H所对应的字符串的第一个字符“b”,即“abb”添加到字串表中,其索引为AH,同时使OldCode=Code=1H。 88 | 89 | 读入下一个编码Code=BH,由于字串表中不存在该索引,因此输出OldCode=1H所对应的字符串“b”加上该字符串的第一个字符“b”,即“bb”,同时将“aa”添加到字串表中,其索引为BH,同时使OldCode=Code=BH。 90 | 91 | 读入下一个编码Code=3H,由于字串表中存在该索引,因此输出其对应的字符串“d”,然后将OldCode=BH所对应的字符串“bb”加上Code=3H所对应的字符串的第一个字符“d”,即“bbd”添加到字串表中,其索引为CH,同时使OldCode=Code=3H。读入下一个编码Code=5H,它等于LZW_EOI,数据解码完毕,最后的解码结果为aabcabbbbd。为清晰起见,完整的解码过程如表3-7所示。 92 | 93 | 表3-7GIF-LZW解码过程 94 | $$ 95 | \begin{array}{|c|c|c|c|c|} 96 | \hline \text { 输入数据 Code } & \text { 新字符串的来源 } & \text { 输出结果 } & \text { OldCode } & \text { 生成的新串及索引 } \\ 97 | \hline 4 H & & & & \\ 98 | \hline 0 H & & a & 0 H & \\ 99 | \hline 0 H & \text { Str(OldCode)+FirstStr(Code) }=aa & a & 0 H & aa<6 H> \\ 100 | \hline 1 H & \text { Str(OldCode)+FirstStr(Code) }=ab & b & 1 H & ab<7 H> \\ 101 | \hline 2 H & \text { Str(OldCode)+FirstStr(Code) }=bc & c & 2 H & bc<8 H> \\ 102 | \hline 7 H & \text { Str(OldCode)+FirstStr(Code) }=ca & ab & 7 H & ca<9 H> \\ 103 | \hline 1 H & \text { Str(OldCode)+FirstStr(Code) }=abb & b & 1 H & abb \\ 104 | \hline BH & \text { Str(OldCode)+FirstStr(OldCode) }=bb & bb & BH & bb \\ 105 | \hline 3 H & \text { Str(OldCode)+FirstStr(Code) }=bbd & d & 3 H & bbd \\ 106 | \hline 5 H & & & & \\ 107 | \hline 108 | \end{array} 109 | $$ -------------------------------------------------------------------------------- /digital-signal-processing/18.IIR数字滤波器的基本结构.md: -------------------------------------------------------------------------------- 1 | # IIR数字滤波器的基本结构 2 | 3 | ## 概述 4 | 5 | 数字滤波器的系统函数: 6 | 7 | $$ 8 | H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_{k=0}^{M} b_{k} z^{-k}}{1+\sum_{k=1}^{N} a_{k} z^{-k}} 9 | $$ 10 | 11 | 常系数线性差分方程: 12 | 13 | $$ 14 | y(n)=-\sum_{k=1}^{N} a_{k} y(n-k)+\sum_{k=0}^{M} b_{k} x(n-k) 15 | $$ 16 | 17 | 18 | 19 | image-20220718165955390 20 | 21 | 例:二阶数字滤波器 22 | 23 | $$ 24 | y(n)=a_{1} y(n-1)+a_{2} y(n-2)+b_{0} x(n) 25 | $$ 26 | 27 | image-20220718170046835 28 | 29 | 30 | 31 | ### 流图结构 32 | 33 | - 节点 34 | - 源节点 35 | - 阱节点 36 | - 网络节点 37 | - 分支节点 38 | - 相加器 39 | - 支路 40 | - 输入之路 41 | - 输出支路 42 | 43 | ### IIR数字滤波器的特点 44 | 45 | 系统函数 46 | $$ 47 | H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_{k=0}^{M} b_{k} z^{-k}}{1+\sum_{k=1}^{N} a_{k} z^{-k}} 48 | $$ 49 | 50 | 差分方程 51 | $$ 52 | y(n)=-\sum_{k=1}^{N} a_{k} y(n-k)+\sum_{k=0}^{M} b_{k} x(n-k) 53 | $$ 54 | 55 | 56 | 1) 系统的单位抽样相应 $h(n)$ 无限长 57 | 58 | 2) 系统函数 $H(z)$ 在有限 $z$ 平面 $(0<|z|<\infty)$ 上有极点存在 59 | 60 | 3) 存在输出到输入的反馈, 递归型结构 61 | 62 | ## IIR数字滤波器的直接型结构 63 | 64 | $$ 65 | H(z)=\frac{\sum_{k=0}^{M} b_{i} z^{-k}}{1+\sum_{k=1}^{N} a_{k} z^{-k}}=\sum_{k=0}^{M} b_{k} z^{-k} \cdot \frac{1}{1+\sum_{k=1}^{N} a_{k} z^{-k}} \\ 66 | H_{1}(z)=\frac{W(z)}{X(z)}=\sum_{k=0}^{M} b_{k} z^{-k} \\ 67 | H_{2}(z)=\frac{Y(z)}{W(z)}=\frac{1}{1+\sum_{k=1}^{N} a_{k} z^{-k}} \\ 68 | w(n)=b_{0} x(n)+b_{1} x(n-1)+\cdots+b_{M} x(n-M) \\ 69 | y(n)=w(n)-a_{1} y(n-1)-a_{2} y(n-2)-\cdots-a_{N} y(n-N) 70 | $$ 71 | 72 | 73 | 74 | ### 直接 I 型结构 75 | 76 | 设 $M=N$ 77 | $$ 78 | w(n)=b_{0} x(n)+b_{1} x(n-1)+\cdots+b_{N} x(n-N)\\ 79 | y(n)=w(n)-a_{1} y(n-1)-a_{2} y(n-2)-\cdots-a_{N} y(n-N) 80 | $$ 81 | ![](https://cdn.mathpix.com/cropped/2022_07_16_7c0db3635c9fddf812a8g-40.jpg?height=400&width=904&top_left_y=538&top_left_x=424) 82 | 83 | 84 | 85 | 交换 $H_{1}(z) H_{2}(z)$ 两级联子系统的级联顺序 86 | 87 | ![](https://cdn.mathpix.com/cropped/2022_07_16_7c0db3635c9fddf812a8g-41.jpg?height=394&width=790&top_left_y=480&top_left_x=482) 88 | 89 | 将 $H_{2}(z)$ 系统的延时器与 $H_{1}(z)$ 系统的延时器共用,即得到直接II型结构 90 | 91 | ### 直接 II 型结构(典范型) 92 | 93 | $$ 94 | y(n)=-\sum_{k=1}^{N} a_{k} y(n-k)+\sum_{k=0}^{M} b_{k} x(n-k) 95 | $$ 96 | 97 | image-20220718171017931 98 | 99 | 100 | 101 | ### 转置直接 II 型结构 102 | 103 | 转置定理:原网络中所有支路方向倒转, 并将输入 $x(n)$ 和输出 $y(n)$ 相 互交换,则其系统函数H(z)不改变。 104 | $$ 105 | y(n) =-\sum_{k=1}^{N} a_{k} y(n-k)+\sum_{k=0}^{M} b_{k} x(n-k) 106 | $$ 107 | 108 | 109 | image-20220718171054695 110 | 111 | 112 | 113 | ### IIR数字滤波器的直接型结构优缺点 114 | 115 | - 优点: 简单直观 116 | 117 | - 缺点: 118 | 119 | - 系数 $a_{, k}$ 对滤波器的性能控制作用不明显 120 | 121 | 122 | - 极点对系数的变化过于灵敏, 易出现不稳定或较大误差 123 | 124 | 125 | - 运算的累积误差较大 126 | 127 | 128 | 对于三阶以上的IIR滤波器, 几乎都不采用直接型结构, 而是采用级联型、并联型等其他形式的结构。 129 | 130 | ## IIR数字滤波器的级联型结构 131 | 132 | 将滤波器系统函数 $H(z)$ 的分子和分母分解为一阶和二阶实系数因子之积的形式 133 | 134 | 135 | 136 | $$ 137 | \begin{aligned} 138 | & H(z)=K \frac{\prod_{k=1}^{M_{1}}\left(1-z_{k} z^{-1}\right) \prod_{k=1}^{M_{2}}\left(1+\alpha_{1, k} z^{-1}+\alpha_{2, k} z^{-2}\right)}{\prod_{k=1}^{N_{1}}\left(1-p_{k} z^{-1}\right) \prod_{k=1}^{N_{2}}\left(1+\beta_{1, k} z^{-1}+\beta_{2, k} z^{-2}\right)} \\ 139 | & H(z)=A \prod_{i=1}^{L} \frac{1+\alpha_{1, i} z^{-1}+\alpha_{2, i} z^{-2}}{1+\beta_{1, i} z^{-1}+\beta_{2, i} z^{-2}}=A \prod_{i=1}^{L} H_{i}(z) 140 | \end{aligned} 141 | $$ 142 | 143 | 画出各二阶基本节的直接型结构, 再将它们级联。 144 | 145 | ### 级联型结构信号流图 146 | 147 | 基于直接II型的级联型结构: 148 | 149 | ![](https://cdn.mathpix.com/cropped/2022_07_16_7c0db3635c9fddf812a8g-47.jpg?height=234&width=1254&top_left_y=485&top_left_x=210) 150 | 151 | 基于转置直接II型的级联型结构: 152 | 153 | ![](https://cdn.mathpix.com/cropped/2022_07_16_7c0db3635c9fddf812a8g-48.jpg?height=218&width=1290&top_left_y=466&top_left_x=216) 154 | 155 | ### IIR数字滤波器的级联型结构优点 156 | 157 | - 便于调整滤波器频率响应性能 158 | 159 | - 调整系数 $\alpha_{1 k}, \alpha_{2 k}$ 能单独调整滤波器的第 $\boldsymbol{k}$ 对零点, 而不影响其它零极点 160 | 161 | - 调整系数 $\beta_{1 k}, \beta_{2 k}$ 能单独调整滤波器的第 $k$ 对极点, 而不影响其它零极点 162 | 163 | - 运算的累积误差比直接型小 164 | 165 | - 具有最少的存储器 166 | 167 | ## IIR数字滤波器的并联型结构 168 | 169 | 将滤波器系统函数 $H(z)$ 展开成部分分式之和, 并将一阶系统仍采用二阶基本节表示 170 | 171 | $$ 172 | H(z)=\gamma_{0}+\sum_{k=1}^{L} \frac{\gamma_{0 k}+\gamma_{1 k} z^{-1}}{1+\beta_{1 k} z^{-1}+\beta_{2 k} z^{-2}} 173 | $$ 174 | 175 | 画出各二阶基本节的直接型结构, 再将它们并联。 176 | 177 | ### 并联型结构信号流 178 | 179 | 基于直接II型的并联型结构 180 | 181 | image-20220718171726867 182 | 183 | 基于转置直接II型 的并联型结构: 184 | 185 | ![image-20220718171841687](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20220718171841687.png) 186 | 187 | ### IIR数字滤波器的并联型结构优点 188 | 189 | - 通过调整系数 $\beta_{1 k}, \beta_{2 k}$ 可单独调整一对极点位置, 但不能单独调整零点位置 190 | - 各并联基本节的误差互相不影响, 故运算误差最小 191 | - 可同时对输入信号进行运算, 故运算速度最高 -------------------------------------------------------------------------------- /digital-image-processing/III/3.12 编程实例.md: -------------------------------------------------------------------------------- 1 | # 3.12 编程实例 2 | 3 | 实现哈夫曼编码的过程实际是构造一个哈夫曼二叉树, 它可分为两大部分:构造哈夫曼树和在哈夫曼树上求叶节点的编码。在构造哈夫曼树时,可设置一个结构数组HuffmanNode保存哈夫曼树中各节点的信息。结构数组元素定义如下: 4 | 5 | ```c++ 6 | typedef struct 7 | { 8 | int Weight; //保存哈夫曼树节点的权值, 在此是指频数 9 | int Flag; //当Flag=0时, 表示该节点未加入树中, 为1时表示已加入树中 10 | int Parent; //存放节点的父节点在节点数组中的序号 11 | int LChild; //存放节点的左子节点在节点数组中的序号 12 | int RChild; //存放节点的右子节点在节点数组中的序号 13 | } HuffmanNode; 14 | 15 | ``` 16 | 17 | ​ 对于一幅BMP图像,调用CpointPro类下的GetHistogram()成员函数可获得图像的直方图数据m_fFreq,这些数据即各灰度出现的频数。利用这些数据可直接进行哈夫曼编码。哈夫曼编码的代码如下: 18 | 19 | ```C++ 20 | void CDlgHuffman::Huffman() 21 | { 22 | CString str; 23 | int i, j, x1, x2, c, p; 24 | int m1, m2; 25 | LV_ITEM lvitem; // ListCtrl的ITEM 26 | int iActualItem; //中间变量, 用于保存ListCtrl中添加的ITEM编号 27 | HuffmanNode *huffNode; //存放哈夫曼树的节点 28 | CString *strCode; //指向各字符的哈夫曼编码的指针 29 | int *iMap; //位置映射指针 30 | int iNumNode = 0; //频数不为零的节点数(或灰度数) 31 | //统计直方图数据中频数不为零的灰度数, 并只对不为零的节点编码 32 | for(i = 0; i < m_iLeafNum; i++) 33 | { 34 | if (m_fFreq[i + m_ChannelSel * m_iLeafNum] != 0) 35 | iNumNode++; 36 | } 37 | //对于具有iNumNode个叶节点的哈夫曼树, 它具有2 iNumNode -1个节点 38 | huffNode = new HuffmanNode[iNumNode * 2 - 1]; 39 | strCode = new CString[iNumNode] 40 | iMap = new int[iNumNode]; 41 | //初始化huffNode中的各节点 42 | for(i = 0; i < iNumNode * 2 - 1; i++) 43 | { 44 | huffNode[i].Weight = 0; 45 | huffNode[i].Parent = 0; 46 | huffNode[i].Flag = 0; 47 | huffNode[i].LChild = -1; 48 | huffNode[i].RChild = -1; 49 | } 50 | //输入iNumNode个叶节点的权值即频数, iMap存放的是频数不为零的灰度值 51 | j = 0; 52 | 53 | for(i = 0; i < m_iLeafNum; i++) 54 | { 55 | if (m_fFreq[i + m_ChannelSel * m_iLeafNum] != 0) 56 | { 57 | huffNode[j].Weight = m_fFreq[i + m_ChannelSel * m_iLeafNum]; 58 | iMap[j] = i; 59 | j++; 60 | } 61 | } 62 | //构造哈夫曼树, 对iNumNode个叶节点, 需构造iNumNode-1次 63 | for(i = 0; i < iNumNode - 1; i++) 64 | { 65 | //对Flag为0的节点比较排序, 选出两个权值最小的子树, x1和x2用于确定 66 | //两子树在数组中的序号, m1和m2用于存放最小两子树的权值 67 | m1 = m2 = m_iSizeImage; 68 | x1 = x2 = 0; 69 | for (j = 0; j < iNumNode + i; j++) 70 | { 71 | if (huffNode[j].Weight < m1 && huffNode[j].Flag = = 0) 72 | { 73 | m2 = m1; 74 | x2 = x1; 75 | m1 = huffNode[j].Weight; 76 | x1 = j; 77 | } 78 | else if (huffNode[j].Weight < m2 && huffNode[j].Flag = = 0) 79 | { 80 | m2 = huffNode[j].Weight; 81 | x2 = j; 82 | } 83 | } 84 | //将找出的两棵最小子树合并为一棵子树 85 | huffNode[x1].Parent = iNumNode + i; 86 | huffNode[x2].Parent = iNumNode + i; 87 | // Flag为1, 说明该节点已经成为其他节点的子节点 88 | huffNode[x1].Flag = 1; 89 | huffNode[x2].Flag = 1; 90 | huffNode[iNumNode + i].Weight = huffNode[x1].Weight + huffNode[x2].Weight; 91 | //权值较小的子树作为右子树 92 | huffNode[iNumNode + i].LChild = x2; 93 | huffNode[iNumNode + i].RChild = x1; 94 | } 95 | //求每个叶节点的哈夫曼编码 96 | for(i = 0; i < iNumNode; i++) 97 | { 98 | c = i; 99 | p = huffNode[c].Parent; 100 | //由叶节点上溯到树根 101 | while (p != 0) 102 | { 103 | //如果是左子树, 则代码的高一位添加0, 否则添加1 104 | if (huffNode[p].LChild = = c) 105 | strCode[i] = "0" + strCode[i]; 106 | else 107 | strCode[i] = "1" + strCode[i]; 108 | c = p; 109 | p = huffNode[c].Parent; 110 | } 111 | } 112 | //计算平均码字长度和图像熵 113 | int CodeLen = 0; 114 | m_fEntropy = 0.0; 115 | for(i = 0; i < iNumNode; i ++ 116 | { 117 | CodeLen += huffNode[i].Weight * strCode[i].GetLength(); 118 | m_fEntropy -= ((double)huffNode[i].Weight / m_iSizeImage) * 119 | log((double)huffNode[i].Weight / m_iSizeImage) / log(2.0); 120 | } 121 | //计算平均码字长度 122 | m_fAvCodeLen = (double)CodeLen/m_iSizeImage; 123 | // 计算编码效率 124 | m_fCodeEfficiency = m_fEntropy / m_fAvCodeLen; 125 | //更新对话框上的文本框中的内容 126 | UpdateData(FALSE);  127 | lvitem.mask = LVIF_TEXT; 128 | //输出哈夫曼编码结果 129 | for (i = 0; i < iNumNode; i ++) 130 | { 131 | if (huffNode[i].Weight > 0) 132 | { 133 | // 添加一项 134 | lvitem.iItem = m_lstTable.GetItemCount(); 135 | str.Format("%u", iMap[i]); 136 | lvitem.iSubItem = 0; 137 | lvitem.pszText = (LPTSTR)(LPCTSTR)str; 138 | iActualItem = m_lstTable.InsertItem(&lvitem); 139 | // 添加其他列 140 | lvitem.iItem = iActualItem; 141 | // 添加灰度值出现的频率 142 | lvitem.iSubItem = 1; 143 | str.Format("%f", (float)huffNode[i].Weight / m_iSizeImage); 144 | lvitem.pszText = (LPTSTR)(LPCTSTR)str; 145 | m_lstTable.SetItem(&lvitem); 146 | // 添加哈夫曼编码 147 | lvitem.iSubItem = 2; 148 | lvitem.pszText = (LPTSTR)(LPCTSTR)strCode[i]; 149 | m_lstTable.SetItem(&lvitem); 150 | // 添加码字长度 151 | lvitem.iSubItem = 3; 152 | str.Format("%u", strCode[i].GetLength()); 153 | lvitem.pszText = (LPTSTR)(LPCTSTR)str; 154 | m_lstTable.SetItem(&lvitem); 155 | } 156 | } 157 | delete[] huffNode; 158 | delete[] strCode; 159 | delete[] iMap; 160 | } 161 | ``` 162 | 163 | -------------------------------------------------------------------------------- /analog/DAC.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 数模转换DAC 4 | 5 | 6 | 7 | ## 基本概念概述 8 | 9 | 数模转换:将数字量(Digital)转换为模拟量(Analog)。简称D/A转换。 10 | 11 | 数模转换器是一种将 二进制数字量转换为模拟量的器件,其基本部分包括精密电阻网络、开关集和电平移动器。 12 | 13 | 用途:可用于自动控制(例如过程控制、高温环境中的控制系统、精密伺服控制、数字控制)、信号处理(例如波线产生、向量产生、数字声频重构、可编程滤波器、超高速数字衰减等)、图像处理以及高分辨率彩色图像系统、机器人以及军事系统方面。 14 | 15 | ### 数模转换器的基本特性 16 | 17 | 数模转换器的基本特性分为两类,一类是静态特性,又称为直流特性,另一类是动态特性,又称为交流特性。如精度、线性、偏置等为静态特性‘信噪比、交调畸变和总谐波畸变等为动态特性。 18 | 19 | #### 一、精度 20 | 21 | 两种类型: 22 | 23 | 1. 绝对精度。影响转换器绝对精度的误差是输入数字码时的模拟输出和期望输出之差,这种误差来自增益误差、零点误差、线性误差和鸣梁声。 24 | 25 | 2. 相对精度。相对精度可表示成1LSB 的百分比,它是满度校正后模拟值在任意数码时对理论值的偏差。 26 | 27 | #### 线性 28 | 29 | ​ 数模转换器的线性误差又称为积分非线性,用满度的百分比(%)表示,表明所测到的转换关系图中的模拟值对直线的偏差。 30 | 31 | #### 分辨率 32 | 33 | N位数模转换器应当能给出 种不同的模拟输出电平,它和输入数码一一对应。模拟输出的最小变化对应满度输出的 34 | 35 | #### 调整时间 36 | 37 | 调整时间是指输入数据改变时,数模转换器输出达到并保持在对应稳态值附近(一般规定为 38 | 39 | ​ LSB对应的电压)所需要的时间。 40 | 41 | #### 信噪比 42 | 43 | S/N=6.02N+1.76dB,式中N是位数。对12位的转换器而言,信噪比为74dB,而18位数模转换器的信噪比可达110dB。 44 | 45 | #### 转换速率 46 | 47 | 转换速率是指输入数码满度变化时转换器输出电压变化的最大速率,该值受电容充电电流的限制(在转换器内部或外接电路中)。转换速率的单位由us/V来表示。它也可用调整时间表示。 48 | 49 | #### 温度稳定性 50 | 51 | 温度稳定性又称为温度系数,它对绝对精度、线性和对称性都有影响。 52 | 53 | 对数模转换器,一般考虑如下几类温度系数: 54 | 55 | - 增益温度系数。增益稳定性主要受参考源随温度变化的影响。 56 | 57 | - 线性温度系数。 58 | 59 | - 偏置温度系数。受参考源和增益电阻随温度变化的影响。 60 | 61 | - 单极性零点温度系数。受漏电流、偏置电压和输出运算放大器偏流的影响。 62 | 63 | [![zNLHHJ.png](https://s1.ax1x.com/2022/11/27/zNLHHJ.png)](https://imgse.com/i/zNLHHJ) 64 | 65 | ![image-20230217202730533](C:/Users/16955/AppData/Roaming/Typora/typora-user-images/image-20230217202730533.png) 66 | 67 | 一个DAC通道的架构由一电阻串DAC和一个输出缓冲放大器构成。 68 | 69 | DAC的输入编码为直接二进制,理想输出电压为: 70 | $$ 71 | V_{\text {OUT }}=\left(\operatorname{Span} \times \frac{D}{N}\right)+V_{M I N} 72 | $$ 73 | 高速数模转化器的基本部件 74 | 75 | ——一组电流开关和电流源 76 | 77 | 结构: 78 | 79 | - 等值电流源经电流开关加到R-2R型网络上 80 | 81 | - 加权电流源经电流开关加到一个电阻上 82 | 83 | 高速数模转化器的电流开关也有两种结构 84 | 85 | ——用于TTL DAC 和用于ECL DAC 86 | 87 | 结构: 88 | 89 | - 对TTL电流开关,输出到R-2R电阻网络 90 | 91 | - 对ECL电流开关,输出呈互补形式 92 | 93 | ![image-20230217202826673](C:/Users/16955/AppData/Roaming/Typora/typora-user-images/image-20230217202826673.png) 94 | 95 | ![image-20230217202833395](C:/Users/16955/AppData/Roaming/Typora/typora-user-images/image-20230217202833395.png) 96 | 97 | 现代电子技术中D/A转换器分类: 98 | 99 | 电压输出型:分辨率范围为8~20位,调整时间在0.8~40us之间 100 | 101 | 电流输出型:分辨率范围为8~20位,调整时间在0.005~2.0us之间 102 | 103 | 视频型:分辨率范围为4~12位,更新速率在35MHz以上,最高超过1000MHz 104 | 105 | ## 部分DAC电路介绍 106 | 107 | #### 一、电压输出数模转换器 108 | 109 | 输入总线接口:并行、串行 110 | 111 | 参考电压:内部、外接 112 | 113 | 分辨率:4,8,10,12,14,16,18,20 114 | 115 | DAC1138(是模拟器件公司的模块式18位数模转换器)参考电压为16V; 116 | 117 | 输出电压范围:0→+5V,0→+10V,±5V,±10V; 118 | 119 | 在10us内可调整至1/2LSB,稳定性极好。 120 | 121 | DAC1138内部结构 122 | 123 | [![zNOuDg.png](https://s1.ax1x.com/2022/11/27/zNOuDg.png)](https://imgse.com/i/zNOuDg) 124 | 125 | #### 二、电流输出数模转换器 126 | 127 | - 调整时间很短,例如**AD9786** 128 | - 分辨率为8位 129 | - 数据更新速率达100MHz 130 | - 输出电流最大为20mA 131 | - 与发射极耦合逻辑兼容 132 | - 参考电压-1.26V 133 | - 转换器为电流输入型 134 | 135 | [![zNOab4.png](zNOab4.png)](https://imgse.com/i/zNOab4) 136 | 137 | 138 | 139 | 输出电流值和参考电压几RSET有关 140 | $$ 141 | i_O=4 \frac{v_{\mathrm{RET}}-V_{\mathrm{REF}}}{\mathrm{R}_{\mathrm{SET}}} 142 | $$ 143 | 抖动很小,能量为200pV.s 144 | 145 | 输出电流可成互补式 146 | 147 | 标称满度输出电流为20mA 148 | 149 | #### 三、视频数模转换器 150 | 151 | 视频数模转换器是高速数模转换器 152 | 153 | 优点:转换速率高,动态性能好 154 | 155 | 用途:一般用于信号重构、任意波形的发生、数字合成、彩色图像系统、自动测试设备、光栅扫描显示、成像处理以及医学成像等方面 156 | 157 | 158 | 159 | 新一代高速转换器采用深亚微米CMOS技术和专有架构,有望实现业界领先的高动态范围关键参数性能。这将从以下三个方面推动下一个千兆赫兹带宽、软件定义系统浪潮。 160 | 161 | 一、让5G大放异彩 162 | 163 | 二、保障安全。 164 | 165 | 三、改善电视体验。例如AD9162 DAC 166 | 167 | 168 | 169 | ![image-20221127134942002](C:\Users\shining\AppData\Roaming\Typora\typora-user-images\image-20221127134942002.png) 170 | 171 | 172 | 173 | ​ 主数据流一分为二,分别进入A道和B道锁存器。 174 | 175 | ​ 每道锁存器的高4位数据分别进入温度计译码器A和B,得到两组15位温度译码输出,两个锁存器2各输出21位数据进入多路转接器,转接器的输出控制电流开关,最后得到互补的电流输出。 176 | 177 | ## 三,DAC技术发展 178 | 179 | ​ 高分辨率数模转换器(DAC)的常见用途之一是提供可控精密电压。分辨率高达20位、精度达1 ppm且具有合理速率的DAC的应用范围包括医疗MRI系统中的梯度线圈控制、测试和计量中的精密直流源、质谱测定和气谱分析中的精密定点和位置控制以及科学应用中的光束检测。 180 | 181 | 182 | 183 | ​ DAC的发展经历了电子管、晶体管到集成电路的过程。它是因人类生产和生活的迫切需要而生产和发展的,其发展的每一阶段都和当时最新科技成就相关联。 184 | 185 | 186 | 187 | ## **四,芯片** 188 | 189 | 190 | 191 | ##### **AD5677R** 192 | 193 | 新 数模转换器:**AD5677R** $19.70 194 | 195 | 16 通道、12/16 位 nanoDAC+且具有2 ppm/°C基准电压源温度系数、I2C 接口 196 | 197 | 高相对精度(INL):16位时位最大值±4LSB(仅限AD5677R) 198 | 199 | TUE: ±0.14% FSR (最大值) 200 | 201 | 失调误差:±1.5 mV (最大值) 202 | 203 | 增益误差:±0.06% FSR(最大值) 204 | 205 | 低漂移,2.5V基准电压源温度系数:2 ppm/℃ 206 | 207 | ​ (典型值) 208 | 209 | 40mA 短路电流 210 | 211 | 宽工作范围:温度范围-40 ℃ 至125℃ 212 | 213 | ​ 电源电压范围2.7 V to 5.5 V 214 | 215 | 216 | 217 | [![zNORqe.png](zNORqe.png)](https://imgse.com/i/zNORqe) 218 | 219 | 220 | 221 | ##### **DACx0502** 222 | 223 | 双电压输出数模转换器 (DAC) 是高度精确的低功耗器件,具有电压输出。DACx0502的精度高,封装小,因此非常适合用于增益和失调校准、电流或电压设定点生成以及电源控制等应用。 224 | 225 | 1LSB INL和DNL(最大值)16位性能 226 | 227 | 4nVs低毛刺脉冲能量 228 | 229 | 宽电源电压范围:2.7V至5.5V 230 | 231 | 缓冲输出范围:5V、2.5V或1.25V 232 | 233 | 低功耗:1mA/通道(5.5V时) 234 | 235 | 集成5ppm/˚C(最大值),2.5V精密基准 236 | 237 | 上电复位:零电平或中间电平 238 | 239 | 引脚可选的串行接口 240 | 241 | -50MHz 3线SPI兼容型接口 242 | 243 | -2线接口(与I2C兼容) 244 | 245 | VDD= 5.5V时的VIH为1.62V 246 | 247 | 温度范围:-40°C至+125°C 248 | 249 | 小型10引脚WSON封装 250 | 251 | [![zNO4IA.png](zNO4IA.png)](https://imgse.com/i/zNO4IA) 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | ##### LTC2644 260 | 261 | 具有 10ppm/ºC 基准的双通道、12 / 10 / 8 位 PWM 至 VOUT DAC 262 | 263 | 无延迟 PWM 至电压转换 264 | 265 | 电压输出可在 8μs 之内更新和稳定 266 | 267 | 100kHz 至 30Hz PWM 输入频率 268 | 269 | ±2.5LSB 最大 INL;±1LSB 最大 DNL (LTC2644-12 270 | 271 | ) 272 | 273 | 保证单调性 274 | 275 | 引脚可选的内部或外部基准 276 | 277 | 2.7V 至 5.5V 电源范围 278 | 279 | 1.71V 至 5.5V 输入电压范围 280 | 281 | 低功率:2.7mA (在 3V),<1μA (断电时) 282 | 283 | [![zNOTRP.png](https://s1.ax1x.com/2022/11/27/zNOTRP.png)](https://imgse.com/i/zNOTRP) 284 | 285 | -------------------------------------------------------------------------------- /digital-signal-processing/4.2 DIT.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 4.2 按时间抽取(DIT)的基-2 FFT算法 4 | 5 | 库利——图基算法 6 | 7 | ## 算法原理 8 | 9 | 设序列点数 $N=2^L, L$ 为整数。 若不满足, 则补零。 10 | 11 | $N$ 为2的整数幂的FFT算法称基-2FFT算法。 12 | 13 | 将序列 $x(n)$ 按 $n$ 的奇偶分成两组: 14 | $$ 15 | x(2 r)=x_1(r) \\ 16 | x(2 r+1)=x_2(r)\\ 17 | r=0,1, \ldots, N / 2-1 18 | $$ 19 | 则$x(n)$的DFT 20 | $$ 21 | \begin{aligned} 22 | X(k)&=\sum_{n=0}^{N-1} x(n) W_N^{n k}\\ 23 | &=\sum_{r=0}^{N / 2-1} x(2 r) W_N^{2 r k}+\sum_{r=0}^{N / 2-1} x(2 r+1) W_N^{(2 r+1) k}\\ 24 | &=\sum_{r=0}^{N / 2-1} x_1(r)\left(W_N^2\right)^{r k}+W_N^k \sum_{r=0}^{N / 2-1} x_2(r)\left(W_N^2\right)^{r k}\\ 25 | &=\sum_{r=0}^{N / 2-1} x_1(r) W_{N / 2}^{r k}+W_N^{k} \sum_{r=0}^{N / 2-1} x_2(r) W_{N / 2}^{r k} \\ 26 | &=X_1(k)+W_N^k X_2(k) \\ 27 | \\ 28 | &r, k=0,1, \ldots N / 2-1 29 | \end{aligned} 30 | $$ 31 | **这是前半部分** 32 | 33 | 再利用周期性求 $X(k)$ 的后半部分 34 | 35 | $\because X_1(k), X_2(k)$ 是以 $N / 2$ 为周期 的 36 | $$ 37 | \therefore X_1\left(k+\frac{N}{2}\right)=X_1(k) \quad X_2\left(k+\frac{N}{2}\right)=X_2(k) 38 | $$ 39 | 又因为 40 | $$ 41 | W_N^{k+\frac{N}{2}}=W_N^{N / 2} W_N^k=-W_N^k 42 | $$ 43 | 故 44 | $$ 45 | \left\{\begin{array}{c} 46 | X(k)=X_1(k)+W_N^k X_2(k) \\ 47 | X\left(k+\frac{N}{n}\right)=X_1(k)-W_N^k X_2(k) 48 | \end{array}\right.\\ 49 | \\ 50 | k=0,1, \ldots, N / 2-1 51 | $$ 52 | image-20221012200851277 53 | 54 | ![image-20221012200924272](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012200924272.png) 55 | 56 | ### 分解后的运算量 57 | 58 | | | 复数乘法 | 复数加法 | 59 | | ------------------ | ------------------------------ | ----------------------------- | 60 | | 一个 $N / 2$ 点DFT | $(N / 2)^2$ | $N / 2(N / 2-1)$ | 61 | | 两个 $N / 2$ 点DFT | $N^{2 }/2$ | $N(N / 2-1)$ | 62 | | 一个蝶形 | 1 | 2 | 63 | | $N / 2$ 个蝶形 | $N/2$ | $N$ | 64 | | 总计 | $N^2 / 2+N / 2\approx N^2 / 2$ | $N(N / 2-1)+N\approx N^2 / 2$ | 65 | 66 | 运算量少了近一半 67 | 68 | ### 继续分解 69 | 70 | $N /$ 2仍为偶数,进一步分解 71 | $$ 72 | N / 2 \rightarrow N / 4 73 | $$ 74 | 75 | $$ 76 | \left\{\begin{array}{c} 77 | x_1(2 l)=x_3(l) \\ 78 | x_1(2 l+1)=x_4(l) 79 | \end{array}\right.\\ 80 | \\ 81 | l=0,1, \ldots, N / 4-1 82 | $$ 83 | 84 | $$ 85 | \left\{\begin{array}{c} 86 | X_1(k)=X_3(k)+W_{N / 2}^k X_4(k) \\ 87 | X_1\left(k+\frac{N}{4}\right)=X_3(k)-W_{N / 2}^k X_4(k) 88 | \end{array}\right.\\ 89 | \\ 90 | k=0,1, \ldots, \frac{N}{4}-1 91 | $$ 92 | 93 | ![image-20221012201415384](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012201415384.png) 94 | 95 | 同理 96 | $$ 97 | \left\{\begin{array}{c} 98 | X_2(k)=X_5(k)+W_{N / 2}^k X_6(k) \\ 99 | X_2\left(k+\frac{N}{4}\right)=X_5(k)-W_{N / 2}^k X_6(k) 100 | \end{array}\right.\\ 101 | \\ 102 | k=0,1, \ldots, \frac{N}{4}-1 103 | $$ 104 | 其中 105 | $$ 106 | X_5(k)=\operatorname{DFT}\left[x_5(l)\right]=\operatorname{DFT}\left[x_2(2 l)\right] \\ 107 | X_6(k)=\operatorname{DFT}\left[x_6(l)\right]=\operatorname{DFT}\left[x_2(2 l+1)\right] 108 | \\ 109 | \\ 110 | l=0,1, \ldots, N / 4-1 111 | $$ 112 | ![image-20221012201552593](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012201552593.png) 113 | 114 | ### 直到分解的尽头 115 | 116 | 这样逐级分解,直到2点DFT 117 | 118 | 当 $N=8$ 时,即分解到 $X_3(k) , X_4(k) , X_5(k) , X_6(k) , k=0,1$ 119 | $$ 120 | \left\{\begin{aligned} 121 | X_3(0) &=x_3(0) W_2^0+W_2^0 x_3(1)=x(0)+W_N^0 x(4) \\ 122 | X_3(1) &=x_3(0) W_2^0+W_2^1 x_3(1)=x(0)-W_N^0 x(4) 123 | \end{aligned}\right.\\ 124 | X_4(k)=\sum_{l=0}^{N / 4-1} x_4(l) W_{N / 4}^{l k}=\sum_{l=0}^1 x_4(l) W_{N / 4}^{l k} \quad k=0,1\\ 125 | \left\{\begin{array}{r} 126 | X_4(0)=x_4(0) W_2^0+W_2^0 x_4(1)=x(2)+W_N^0 x(6) \\ 127 | X_4(1)=x_4(0) W_2^0+W_2^1 x_4(1)=x(2)-W_N^0 x(6) 128 | \end{array}\right. 129 | $$ 130 | 131 | 132 | ![image-20221012201851397](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012201851397.png) 133 | 134 | 135 | 136 | ## 运算量 137 | 138 | 当 $N=2^L$ 时,共有 $L$ 级蝶形,每级 $N / 2$ 个蝶形,每个蝶形有 1 次复数 乘法2次复数加法。 139 | 140 | 复数乘法 141 | $$ 142 | m_F=\frac{N}{2} L=\frac{N}{2} \log _2 N 143 | $$ 144 | 复数加法 145 | $$ 146 | a_F=N L=N \log _2 N 147 | $$ 148 | 比较DFT 149 | $$ 150 | \frac{m_F(D F T)}{m_F(F F T)}=\frac{N^2}{\frac{N}{2} \log _2 N}=\frac{2 N}{\log _2 N} 151 | $$ 152 | ![image-20221012202138082](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012202138082.png) 153 | 154 | ## 算法特点 155 | 156 | ### 原位计算 157 | 158 | $$ 159 | \left\{\begin{array}{l} 160 | X_m(k)=X_{m-1}(k)+X_{m-1}(j) W_N^r \\ 161 | X_m(j)=X_{m-1}(k)-X_{m-1}(j) W_N^r 162 | \end{array}\right. 163 | $$ 164 | 165 | $m$ 表示第 $m$ 级迭代, $k, j$ 表示数据所在的行数 166 | 167 | ![image-20221012202311998](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012202311998.png) 168 | 169 | 所谓原位计算, 就是当数据输入到存储器后, 每一级运算的结果仍然则存在这同一组存储器中, 直到最后输出, 中间无需其它存储器。 170 | 171 | ### 倒位序 172 | 173 | $$ 174 | n=\left(n_2 n_1 n_0\right)_2\\ 175 | \hat{n}=\left(n_0 n_1 n_2\right)_2 176 | $$ 177 | 178 | #### 倒位序的实现 179 | 180 | 在实际运算时, 先按自然顺序将输入序列存入存储单元, 再通过变址运算将自 然顺序变换成按DIT-FFT算法要求的顺序。变址过程可用程序实现-称为“整序”或 "重排" 181 | 182 | ![image-20221012202813321](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20221012202813321.png) 183 | 184 | (1) 当 I=J时, 数据不必调换; 185 | (2) 当 $I \neq J$ 时, 必须将原来存放数据 $x$ (I) 送入暂存器 $R$, 再将 $x(J)$ 送入 $x(I), R$ 中内容送 $\mathrm{x}(\mathrm{J})$, 进行数据对调; 186 | (3)为了避免再次调换已调换过的数据, 保证调换只进行一次, 否则又变回原状, 只在 $\mathrm{I}<\mathrm{J}$ 时, 调换。 187 | 188 | #### 算法实现(补充) 189 | 190 | 采用雷德算法:已知数i的倒位序是j,求下一个数的倒位序 191 | 192 | ```C 193 | int i,j,k; 194 | int temp; 195 | for(j=0,i=0;i 196 | { 197 | if(i= k) //如果k<=j,表示j的最高位为1 205 | { 206 | j = j-k; //把最高位变成0 207 | k = k/2; //k/2,比较次高位,依次类推,逐个比较,直到某个位为0 208 | } 209 | j = j+k; //把0改为 210 | } -------------------------------------------------------------------------------- /analog/新型有源滤波器.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 新型有源滤波器 4 | 5 | ### **滤波器基本知识** 6 | 7 | 对特定频率的频点或该频点以外的频率进行有效滤除的电路,就是滤波器,其功能就是得到一个特定频率或消除一个特定的频率。 8 | 9 | 常用于: 10 | 11 | 改变信号的频率特性 12 | 13 | A/D转换的前置滤波器,防止频率混叠(香农采样定律) 14 | 15 | 提取有用信号,滤除无用信号或干扰噪声 16 | 17 | ### **滤波器的分类** 18 | 19 | 1.按所处理的信号分 20 | 21 | 模拟滤波器、数字滤波器 22 | 23 | 2.按所采用的元器件分 24 | 25 | 有源滤波器、无源滤波器 26 | 27 | 3.有源滤波器按频率特性分 28 | 29 | LPF、HPF、BPF、BEF、APF 30 | 31 | 4.有源滤波器按阶跃响应分为 32 | 33 | 最大平坦响应滤波器(巴特沃思滤波器)、 34 | 35 | 线性相位响应滤波器(贝塞尔滤波器)、 36 | 37 | 等纹波滤波器(切比雪夫滤波器) 38 | 39 | ### **滤波器主要参数** 40 | 41 | **截止频率:f1 、f2(-3dB点)** 42 | 43 | **中心频率:**通带的中心频率fc,一般取fc=(f1+f2)/2 44 | 45 | **通带带宽:**BW =(f2-f1)(-3dB带宽) 46 | 47 | **品质因数:**Q = fc/BW 48 | 49 | **通带增益,插入损耗等** 50 | 51 | 52 | 53 | ### 有源滤波器的应用: 54 | 55 | ##### 1、通信行业 56 | 57 |   为了满足大规模数据中心机房的运行需要,通信配电系统中的UPS使用容量在大幅上升。据调查,通信低压配电系统主要的谐波源设备为UPS、开关电源、变频空调等。 58 | 59 |   其产生的谐波含量都较高,且这些谐波源设备的位移功率因数极高。通过使用有源滤波器可以提高通信系统及配电系统的稳定性,延长通信设备及电力设备的使用寿命,并且使配电系统更符合谐波环境的设计规范。 60 | 61 | ##### 2、半导体行业 62 | 63 |   大多数半导体行业的3次谐波非常严重,主要是由于企业中使用了大量的单相整流设备。3次谐波属于零序谐波,具备在中性线汇集的特点,导致中性线压力过大,甚至出现打火现象,存在着极大的生产安全隐患。 64 | 65 |   谐波还会造成断路器跳闸,耽误生产时间。3次谐波在变压器内形成环流,加速了变压器的老化。严重的谐波污染必然对配电系统中的设备使用效率和寿命造成影响。 66 | 67 | ##### 3、石化行业 68 | 69 |   由于生产的需要,石化行业中存在着大量泵类负载,并且不少泵类负载都配有变频器。变频器的大量应用使石化行业配电系统中的谐波含量大大增加。 70 | 71 |   目前绝大部分变频器整流环节都是应用6脉冲将交流转化为直流,因此产生的谐波以5次、7次、11次为主。其主要危害表现为对电力设备的危害及在计量方面的偏差。使用有源滤波器可以很好地解决这方面的问题。 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | ### 滤波器的分析计算: 80 | 81 | [![pSr1ztS.png](https://s1.ax1x.com/2023/02/02/pSr1ztS.png)](https://imgse.com/i/pSr1ztS) 82 | 83 | 求解一阶有源滤波器的放大倍数Av和通带放大倍 数Avp: 84 | 设电路的输入电压为Ui(s),运放的同相输入端的 电压为 U+(s)。在同相输入端根据分压原理有: 85 | $$ 86 | U_{+}(s)=\frac{\frac{1}{s C}}{R+\frac{1}{s C}} \cdot U_i(s) 87 | $$ 88 | 设电路的输出电压为Uo(s), 89 | 则: 90 | $$ 91 | U_\theta(s) \cdot=A_{v p} \cdot U_{+}(s)=\left(1+\frac{R_2}{R_1}\right) U_{+}(s) 92 | $$ 93 | 根据上述两个式子,可以得到Av和Avp为: 94 | $$ 95 | A_v=\frac{U_0(s)}{U_i(s)}=\frac{1+\frac{R_2}{R_1}}{1+R C s}=\frac{A_{v p}}{1+R C s} 96 | $$ 97 | 在上式中,令s=jw=j2πf,得到 98 | $$ 99 | A_v=\frac{A_{v p}}{1+R C s}==\frac{A_{v p}}{1+j \frac{f}{f_p}} 100 | $$ 101 | 其中fp,为此一阶有源低通滤波器的通带截止频率, 其大小为: 102 | $$ 103 | f_p=\frac{1}{2 \pi R C} 104 | $$ 105 | 106 | 107 | 108 | 109 | ### 开关电容滤波器 110 | 111 | 开关电容的基本知识 112 | 113 | 电路组成: 114 | 115 | 电路的两节点间接有带高速开关的电容器,如下两图分别为串联形式和并联形式。 116 | 117 | 其中的开关不是普通的机械开关,而是以几千赫兹的很高频率打开、闭合的电子开关。 118 | 119 | 两个开关是交替通断。设S1的电平为φ,S2的电平为φ ̅,和φ正好相反。 120 | 121 | [![pSr3iXn.png](https://s1.ax1x.com/2023/02/02/pSr3iXn.png)](https://imgse.com/i/pSr3iXn) 122 | 123 | 等效的物理模型:一个阻值受开关频率控制的电阻。 124 | 125 | 下面以并联形式为例进行理论推导。 126 | 127 | **开关电容的理论推导** 128 | 129 | 1、当φ =1时,S1闭合,S2打开,电容C充电,其电荷量为Q1=CUi 130 | 131 | 2、当φ =0时,S1打开,S2闭合,电容C放电,其电荷量为Q2=CUo 132 | 133 | 3、设开关的周期为Tc,在一个周期中,电容电荷量的改变量为: △Q=Q1-Q2=C(Ui-Uo) 134 | 135 | 4、计算流过输入端和输出端的电流 136 | $$ 137 | i=\frac{△Q}{T_c}=\frac{C(U_{i}-U_{o})}{T_{c}} 138 | $$ 139 | 5、在一个周期内,可以把整个开关电容滤波电路等效为一个电阻,其大小为: 140 | $$ 141 | R_{等效}=\frac{(U_i-U_o)}{i}=\frac{T_c}{C}=\frac{1}{f_c C} 142 | $$ 143 | ​ 获得阻值受开关频率控制的等效电阻 144 | 145 | 6、从推导出的公式可知,C越小,R越大 146 | 147 | 7、若想改变等效电阻R,只需要改变时钟周期Tc即可。 148 | 149 | 150 | 151 | ### 开关电容的应用 152 | 153 | ##### **实现低通滤波器截止频率可调** 154 | 155 | 将一阶有源低通滤波器中同相端的输入电阻用开关电容滤波器代替,如下图所示。按照前面的对一阶有源低通滤波器的推导,其放大倍数为: 156 | $$ 157 | A_v=\frac{1+\frac{R_2}{R_1}}{1+RCs}=\frac{1+\frac{R_2}{R_1}}{1+\frac{C_2}{f_cC_1}s} 158 | $$ 159 | 160 | 161 | [![pSr8RIK.png](https://s1.ax1x.com/2023/02/02/pSr8RIK.png)](https://imgse.com/i/pSr8RIK) 162 | 163 | 其通带放大倍数为: 164 | $$ 165 | A_{vp}=1+\frac{R_2}{R_1} 166 | $$ 167 | 其通带截止频率为: 168 | $$ 169 | f_p=\frac{1}{2\pi RC}=\frac{C_1}{2\pi C_2 }f_c 170 | $$ 171 | 172 | 173 | 174 | 175 | ##### 开关电容积分器 176 | 177 | [![pSrGAiT.png](https://s1.ax1x.com/2023/02/02/pSrGAiT.png)](https://imgse.com/i/pSrGAiT) 178 | 179 | 将密勒积分器中同相端的输入电阻用开关电容滤波器代替,如右图所示。计算其放大倍数为: 180 | $$ 181 | A_v=\frac{U_o}{U_i}=-\frac{\frac{1}{SC_1}i}{Ri}=-\frac{1}{RC_1s} 182 | $$ 183 | 按照开关电容电路的推导公式,等效电阻的大小为: 184 | $$ 185 | R=\frac{1}{f_cC_2} 186 | $$ 187 | 代入上式中得到: 188 | $$ 189 | A_v=-\frac{1}{RC_1S}=-\frac{f_c C_2}{C_1 s} 190 | $$ 191 | 192 | ### 开关电容的特点 193 | 194 | 1、当时钟频率一定时,开关电容滤波器的特性仅取决于电容的比值。由于采用了特种工艺,这种电容的比值精度可达0.01%,并且具有良好的温度稳定性; 195 | 196 | 2、当电路结构确定之后,开关电容滤波器的特性仅与时钟频率有关,改变时钟频率即可改变其滤波器特性; 197 | 198 | 3、开关电容滤波器可直接处理模拟信号,而不必像数字滤波器那样需要A/D、D/A变换,简化了电路设计,提高了系统的可靠性。 199 | 200 | 201 | 202 | ### 开关电容的非理想性 203 | 204 | **1**.时钟馈通。开关晶体管存在栅极和扩散层之间的电容,包括沟道的充放电电容,在时钟信号出现时,信号会馈通到负载电容上,形成误差。 205 | 206 | **2.失调误差**。这种误差由采样周期之间开关电容的漏电流引起。 207 | 208 | **3.噪声**。有源开关电容滤波器的噪声有2个来源:即开关电容和运算放大器。 209 | 210 | 4.**电荷的不完全传输:**MOS管开关不是理想开关,其接通电阻非零,因而最大开关速率将由电荷传输情况决定。 211 | 212 | 5、**非线性**PN结:两个理想开关间理应有两个PN结,及作用会使电容的等效电阻阻值减小。 213 | 214 | 215 | 216 | 217 | 218 | ### 运算跨导放大器 219 | 220 | 运算跨导放大器(Operational Transconductance Amplifier,OTA),顾名思义,即可知其输入为电压而输出为电流,因而这种放大器的输入和输出阻抗都很高。 221 | 222 | 其可以通过控制外部偏流调节自身的跨导。若用它来代替有源滤波器中的电阻,即可将滤波器集成化。 223 | 224 | 相反,一般的运算放大器虽然可以构成有源滤波器,但要把滤波器集成化,且可以在外部用电压或电流来控制滤波器的特性,则很困难。 225 | 226 | [![pSrG7pF.png](https://s1.ax1x.com/2023/02/02/pSrG7pF.png)](https://imgse.com/i/pSrG7pF) 227 | 228 | 跨导放大器输入为电压而输出为电流,因而这种放大器的输入和输出阻抗都很高。 229 | 230 | 上图为运算跨导放大器的符号和等效电路,其中io是输出电流,IB是偏置电流,即外部控制电流。 231 | $$ 232 | 跨导公式如右: G_m=hI_B 233 | $$ 234 | 其中Gm为跨导,h为常数。 235 | 236 | h与温度、器件的几何形状及处理方法有关。 237 | 238 | 输出电流Io和输入电压Uid关系式如下: 239 | $$ 240 | I_O=G_mU_{id}=G_m(U_{i+}-U_{i-}) 241 | $$ 242 | 243 | #### 运算跨导放大器的应用 244 | 245 | **反向电压放大器** 246 | 247 | [![pSrJJA0.jpg](https://s1.ax1x.com/2023/02/02/pSrJJA0.jpg)](https://imgse.com/i/pSrJJA0) 248 | $$ 249 | U_o=-G_mU_iR_L\\ 250 | A_v=\frac{U_o}{U_i}=\frac{-G_mU_iR_L}{U_i}=-G_mR_L 251 | $$ 252 | 253 | 254 | 255 | 256 | **最简单积分器** 257 | 258 | [![pSrJ87q.jpg](https://s1.ax1x.com/2023/02/02/pSrJ87q.jpg)](https://imgse.com/i/pSrJ87q) 259 | $$ 260 | A_v=\frac{U_{o(s)}}{U_{i(s)}}=\frac{G_m}{sC} 261 | $$ 262 | **高通/低通滤波器** 263 | 264 | [![pSrYNVI.jpg](https://s1.ax1x.com/2023/02/02/pSrYNVI.jpg)](https://imgse.com/i/pSrYNVI) 265 | $$ 266 | A_{v(s)}=\frac{G_m}{G_m+SC}=\frac{1}{1+\frac{Cs}{G_m}}\\ 267 | f_c=\frac{G_m}{2\pi C} 268 | $$ 269 | 270 | ### **相关芯片** 271 | 272 | 有源滤波器 **AD:LTC6601** 273 | 274 | 开关电容滤波器 **TI:TLC14** 275 | 276 | 运算跨导放大器 **TI:OPA861** -------------------------------------------------------------------------------- /digital-image-processing/VI/6.1 几何变换基础.md: -------------------------------------------------------------------------------- 1 | # 6.1 几何变换基础 2 | 3 | 4 | 5 | ## 6.1.1 概述 6 | 7 | 图像的几何变换,是指使用户获得或设计的原始图像。按照需要产生大小、形状和位置的变化。从图像类型来分,图像的几何变换有二维平面图像的几何变换和三维图像的几何变换以及由三维向二维平面投影变换等。从变换的性质分, 图像的几何变换有平移、比例缩放、旋转、反射和错切等基本变换,透视变换等复合变换,以及插值运算等。 8 | 9 | 数字图像是把连续图像在坐标空间和性质空间离散化了的图像。例如,一幅二维数字图像就是把一幅连续的二维(2D)。图像在坐标空间XOY和性质空间F都离散化了的图像,它可以用一组二维(2D)数组f(x, y)来表示,其中x和y表示2D空间XOY中一个坐标点的位置,f代表图像在点(x, y)的某种性质F的数值,如果所处理的是一幅灰度图,这时f表示灰度值。而且此时f、x、y都在整数集合中取值。因此,除了插值运算外,常见的图像几何变换可以通过与之对应的矩阵线性变换来实现。 10 | 11 | 对于2D图像几何变换及变换中心在坐标原点的比例缩放、 反射、 错切和旋转等各种变换,都可以用2×2的矩阵表示和实现。但是一个2×2变换矩阵$T=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]$却不能实现图像的平移以及绕任意点的比例缩放、反射、错切和旋转等各种变换。因此,为了能够用统一的矩阵线性变换形式,表示和实现这些常见的图像几何变换,就需要引入一种新的坐标,即齐次坐标。利用齐次坐标来变换处理,才能实现上述各种2D图像的几何变换。 12 | 13 | ## 6.1.2 齐次坐标 14 | 15 | 现设点 $P_0\left(x_0, y_0\right)$ 进行平移后, 移到 $P(x, y)$, 其中 $x$ 方向的平移量为 $\Delta x, y$ 方向的平移量为 $\Delta y$ 。那么, 点 $P(x, y)$ 的坐标为 16 | $$ 17 | \left\{\begin{array}{l} 18 | x=x_0+\Delta x \\ 19 | y=y_0+\Delta y 20 | \end{array}\right. 21 | $$ 22 | 如图6-1所示。这个变换用矩阵的形式可以表示为 23 | $$ 24 | \left[\begin{array}{l} 25 | x \\ 26 | y 27 | \end{array}\right]=\left[\begin{array}{ll} 28 | 1 & 0 \\ 29 | 0 & 1 30 | \end{array}\right]\left[\begin{array}{l} 31 | x_0 \\ 32 | y_0 33 | \end{array}\right]+\left[\begin{array}{l} 34 | \Delta x \\ 35 | \Delta y 36 | \end{array}\right] 37 | $$ 38 | 图6-1 点的平移(不再是笛卡尔坐标系) 39 | 40 | 而平面上点的变换矩阵$T=\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]$中没有引入平移常量,无论$a、b、c、d$取什么值,都不能实现上述的平移变换。因此,需要使用$2\times3$阶变换矩阵,取其形式为 41 | $$ 42 | T=\left[\begin{array}{ccc} 43 | 1 & 0 & \Delta x \\ 44 | 0 & 1 & \Delta y 45 | \end{array}\right] 46 | $$ 47 | 此矩阵的第一、二列构成单位矩阵,第三列元素为平移常量。由上述可知,对2D图像进行变换,只需要将图像的点集矩阵乘以变换矩阵即可,2D图像对应的点集矩阵是2×*n*阶的,而上式扩展后的变换矩阵是2×3阶的矩阵,这不符合矩阵相乘时要求前者的列数与后者的行数相等的规则。 48 | 49 | 所以需要在点的坐标列矩阵 $\left[\begin{array}{ll}x & y\end{array}\right]^{T}$ 中引入第三个元素, 增加一个附加坐标, 扩展为 $3 \times 1$ 的列矩阵 $\left[\begin{array}{lll}x & y & 1\end{array}\right]^{T}$, 这样用三维空间点 $(x, y, 1)$ 表示二维空间点 $(x, y)$, 即采用一种特殊的坐标,可以实现平移变换,变换结果为 50 | $$ 51 | P=T \cdot P_0=\left[\begin{array}{ccc}1 & 0 & \Delta x \\ 0 & 1 & \Delta y\end{array}\right]\left[\begin{array}{l}x_0 \\ y_0 \\ 1\end{array}\right]=\left[\begin{array}{l}x_0+\Delta x \\ y_0+\Delta y\end{array}\right]=\left[\begin{array}{l}x \\ y\end{array}\right] 52 | $$ 53 | 54 | 式 $\left\{\begin{array}{l}x=x_0+\Delta x \\ y=y_0+\Delta y\end{array}\right.$ 符合上述平移后的坐标位置。通常将 $2 \times 3$ 阶矩阵扩 55 | 充为 $3 \times 3$ 阶矩阵, 以拓宽功能。由此可得平移变换矩阵为 56 | $$ 57 | T=\left[\begin{array}{lll} 58 | 1 & 0 & \Delta x \\ 59 | 0 & 1 & \Delta y 60 | \end{array}\right] \text { a- } 61 | $$ 62 | 下面再验证一下点 $P(x, y)$ 按照 $3 \times 3$ 的变换矩阵 $T$ 平移变换的结果 63 | $$ 64 | P=T \cdot P_0=\left[\begin{array}{lll} 65 | 1 & 0 & \Delta x \\ 66 | 0 & 1 & \Delta y \\ 67 | 0 & 0 & 1 68 | \end{array}\right]\left[\begin{array}{l} 69 | x_0 \\ 70 | y_0 \\ 71 | 1 72 | \end{array}\right]=\left[\begin{array}{l} 73 | x_0+\Delta x \\ 74 | y_0+\Delta y \\ 75 | 1 76 | \end{array}\right]=\left[\begin{array}{l} 77 | x \\ 78 | y \\ 79 | 1 80 | \end{array}\right] 81 | $$ 82 | 从上式可以看出, 引入附加坐标后, 扩充了矩阵的第 3 行, 并没有使变换结果受到影响。这种用 $n+1$ 维向量表示 $n$ 维向量的方法称为齐次坐标表示法。 83 | 84 | 因此, 2D图像中的点坐标 $(x, y)$ 通常表示成齐次坐标 $(H x, H y$, H), 其中 $H$ 表示非零的任意实数, 当 $H=1$ 时, 则 $(x, y, 1)$ 就称为点 $(x, y)$ 的规范化齐次坐标。显然规范化齐次坐标的前两个数是相应二维点的坐标, 没有变化, 仅在原坐标中增加了 $H=1$ 的附加坐标。 85 | 由点的齐次坐标 $(H x, H y, H)$ 求点的规范化齐次坐标 $(x, y,1)$, 可按如下公式进行: 86 | $$ 87 | x=\frac{H x}{H} \quad y=\frac{H y}{H} 88 | $$ 89 | 90 | 齐次坐标的几何意义相当于点 $(x, y)$ 落在 $3 D$ 空间 $H=1$ 的平面上, 如图6-2所示。如果将XOY 平面内的三角形 $abc$ 的各顶点表示成齐次坐标 $\left(x_i, y_i, 1\right)(i=1,2,3)$ 的形式, 就变成 $H=1$ 平面内的三角形 $a_1 b_1 c_1$ 的各顶点。 91 | 92 | image-20230328144044825 93 | 94 | 图6-2 齐次坐标的几何意义 95 | 96 | 齐次坐标在2D图像几何变换中的另一个应用是:如某点S(60 000, 40 000)在16位计算机上表示则大于32 767的最大坐标值, 需要进行复杂的操作。但如果把S的坐标形式变成(Hx, Hy, H) 形式的齐次坐标,则情况就不同了。在齐次坐标系中,设H=1 /2,则 (60 000,40 000)的齐次坐标为(1/2x, 1/2y, 1/2),那么所要表示的点变为(30 000, 20 000, 1/2),此点显然在16位计算机上二进制数所能表示的范围之内。 97 | 98 | 因此,采用齐次坐标,并将变换矩阵改成3×3阶的形式后, 便可实现所有2D图像几何变换的基本变换。 99 | 100 | ## 6.1.3 二维图像几何变换的矩阵 101 | 102 | 103 | 104 | 利用齐次坐标及改成 $3 \times 3$ 阶形式的变换矩阵, 实现 $2 D$ 图像几何变换的基本变换的一般过程是: 将 $2 \times n$ 阶的二维点集矩阵 $\left[\begin{array}{c}x_{0 i} \\ y_{0 i}\end{array}\right]_{2 \times n}$ 矩阵龶示成齐次完成, 坐标 $\left[\begin{array}{l}x_{0 i} \\ y_{0 i} \\ 1\end{array}\right]_{3 \times n}$ 的形式, 然后乘以相应的变换 105 | 变换后的点集矩阵=变换矩阵 $T \times$ 变换前的点集矩阵 106 | (图像上各点的新齐次坐标) (图像上各点的原齐次坐标) 107 | 108 | 设变换矩阵T为 109 | $$ 110 | T=\left[\begin{array}{lll} 111 | a & b & p \\ 112 | c & d & q \\ 113 | l & m & s 114 | \end{array}\right] 115 | $$ 116 | 则上述变换可以用公式表示为 117 | $$ 118 | \left[\begin{array}{cccc} 119 | H x_1^{\prime} & H x_2^{\prime} & \Lambda & H x_n^{\prime} \\ 120 | H y_1^{\prime} & H y_2^{\prime} & \Lambda & H y_n^{\prime} \\ 121 | H & H & \Lambda & H 122 | \end{array}\right]_{3 \times n}=T \times\left[\begin{array}{llll} 123 | x_1 & x_2 & \Lambda & x_n \\ 124 | y_1 & y_2 & \Lambda & y_n \\ 125 | 1 & 1 & \Lambda & 1 126 | \end{array}\right]_{3 \times n} 127 | $$ 128 | 图像上各点的新齐次坐标规范化后的点集矩阵为 129 | $$ 130 | \left[\begin{array}{rrrr} 131 | x_1^{\prime} & x_2^{\prime} & \Lambda & x_n^{\prime} \\ 132 | y_1^{\prime} & y_2^{\prime} & \Lambda & y_n^{\prime} \\ 133 | 1 & 1 & \Lambda & 1 134 | \end{array}\right]_{3 \times n} 135 | $$ 136 | 引入齐次坐标后,表示2D图像几何变换的3×3矩阵的功能就完善了,可以用它完成2D图像的各种几何变换。下面讨论 3×3阶变换矩阵中各元素在变换中的功能。几何变换的3×3矩阵的一般形式为 137 | $$ 138 | T=\left[\begin{array}{lll} 139 | a & b & p \\ 140 | c & d & q \\ 141 | l & m & s 142 | \end{array}\right] 143 | $$ 144 | 3×3的阶矩阵T可以分成四个子矩阵。其中,$\left[\begin{array}{ll}a & b \\ c & d\end{array}\right]_{2 \times 2}$这一子矩阵可使图像实现恒等、 比例、 反射(或镜像)、 错切和旋转变换。[l m]这一行矩阵可以使图像实现平移变换。[p q] T这一列矩阵可以使图像实现透视变换,但当p=0,q=0时它无透视作用。[s]这一元素可以使图像实现全比例变换。例如, 将图像进行全比例变换, 即 145 | $$ 146 | \left[\begin{array}{lll}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & s\end{array}\right] \times\left[\begin{array}{c}x_{0 i} \\ y_{0 i} \\ 1\end{array}\right]=\left[\begin{array}{c}x_i \\ y_i \\ s\end{array}\right] 147 | $$ 148 | 149 | 将齐次坐标$[x_i \quad y_i \quad s]^T$规范化后,$[\dfrac{x_{oi}}{s} \quad \dfrac{y_{oi}}{s} \quad s]^T=[x_i \quad y_i \quad 1]^T$。 由此可见 150 | 151 | 当 $s>1$ 时, 图像按比例缩小; 当 $0 175 | 176 | 图2-11 DFT和DCT的频谱分布 177 | 178 | (a)DFT频谱分布; (b) DCT频谱分布 179 | -------------------------------------------------------------------------------- /digital-image-processing/VIII/8.3 灰值形态学.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 8.3 灰值形态学 4 | 5 | ## 8.3.1 灰值腐蚀 6 | 7 | 用结构元素 $b$ 对输入图像 $f(x, y)$ 进行灰值腐蚀记为 $f \ominus b$, 其定义为 8 | 9 | $$ 10 | (f \ominus b)(s, t)=\min \left\{f(s+x, t+y)-b(x, y) \mid s+x, t+y \in D_{f}, x+y \in D_{b}\right\} 11 | $$ 12 | 13 | 式中, $D_{f}$ 和 $D_{b}$ 分别是 $f$ 和 $b$ 的定义域。 14 | 15 | 这里限制 $(s+x)$ 和 $(t+y)$ 在 $f$ 的定义域之内,类似于二值腐蚀定义中要求结构元素完全包括在被腐蚀集合中。 16 | 17 | 为简单起见, 下面用一维函数来简单介绍式(8-13)的含义和运算操作机理。用一维函数时, 式 (8-13) 可简化为 18 | 19 | $$ 20 | (f \ominus b)(s)=\min \left\{f(s+x)-b(x) \mid s+x \in D_{f}, x+y \in D_{b}\right\} 21 | $$ 22 | 23 | 如同在相关计算中, 对正的$s$, $f(s+x)$ 移向右边, 对负的$s$,$f(s+x)$ 移向左边。要求 $(s+x)$ 在 $f$ 的定义域内并要求 $x$ 的值在 $b$ 的定义域内, 是为了把 $b$ 完全包含在 $f$ 的平移范围内。 24 | 25 | ![image-20230404144254199](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404144254199.png) 26 | 27 | 图8-17 灰值腐蚀示意图 28 | (a) 图像f; (b) 结构元素b ; 29 | (c) 用结构元素b对f腐蚀; (d)用结构元素b对f腐蚀的结果 30 | 31 | ![image-20230404144318359](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404144318359.png) 32 | 33 | 图8-18 灰值腐蚀与膨胀前后的图像 34 | (a) 原始图像; (b) 灰值腐蚀后的图像; (c)灰度膨胀后的图像 35 | 36 | 腐蚀的计算是在由结构元素确定的邻域中选取 $f \ominus b$ 的最小值,因此,对灰值图像的府蚀操作有两类效果: (1)如果结构元素的值都为正的, 则输出图像会比输入图像暗;(2)如果输入图像中亮细节的尺寸比结构元素小, 则其影响会被减弱, 减弱的程度取决于这些亮细节周围的灰度值和结构元素的形状和幅值。 37 | 38 | ## 8.3.2 灰值膨胀 39 | 40 | 用结构元素 $b$ 对输入图像 $f(x, y)$ 进行灰值膨胀记为 $f \oplus b$, 其定义为 41 | 42 | $$ 43 | (f \oplus b)(s, t)=\max \left\{f(s-x, t-y)+b(x, y) \mid s-x, t-y \in D_{f}, x+y \in D_{b}\right\} \quad 44 | $$ 45 | 46 | 式中, $D_{f}$ 和 $D_{b}$ 分别是 $f$ 和 $b$ 的定义域。这里限制 $(s-x)$ 和 $(t-y)$ 在 $f$ 的定义域之内, 类似于在二值膨胀定义中要求两个运算集合至少有一个 (非零) 元素相交。式(8-15)与二维离散函数的卷积的形式很类似, 区别是式 (8-15) 用 $\max ($ 最大)替换了卷积的求和, 用加法替换了卷积的相乘。 47 | 48 | 为简单起见, 下面用一维函数来简单介绍式 (8-15) 的含义和运算操作机理。用一维函数时, 式 (8-15) 可简化为 49 | $$ 50 | (f \oplus b)(s)=\max \left\{f(s-x)+b(x) \mid s-x \in D_{f}, x \in D_{b}\right\} 51 | $$ 52 | 53 | 和卷积相似, $f(-x)$ 是对应 $x$ 轴原点的映射。对正的s, $f(s-x)$ 移向右边, 对负的 $s, f(s-x)$ 移向左边。要求 $(s-x)$ 在 $f$ 的定义域内并要求 $x$ 的值在 $b$ 的定义域内, 是为了使 $f$ 和 $b$ 的交集非空 (有相重合部分)。 54 | 55 | 注意, 与8.2.2节中介绍二值膨胀时不同的是, 在式(8-15)和式(8-16)里是让 $f$ 而不是让 $b$ 反转平移。这是因为膨胀具有互换性, 而腐蚀不具有互换性。为了让膨胀和腐蚀的表达形式互相对应, 采用了式(8-15)和式(8-16)的表示, 但由图8-19中的例子可以看出, 如果让 $b$ 反转平移进行膨胀, 其结果也完全一样。膨胀的计算是在由结构元素确定的邻域中选取 $f_{b}$ 的最大值, 因此对灰值图像的膨胀操作有两类效果: (1)如果结构元素的值都为正的, 则输出图像会比输入图像亮; (2)根据输入图像中暗细节的灰度值以及它们的形状相对于结构元素的关系, 它们在膨胀中或被消减或被除掉。 56 | 57 | ![image-20230404144738741](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404144738741.png) 58 | 59 | 图8-19 灰值膨胀示意图 60 | (a) 灰度膨胀过程; (b) 灰度膨胀结果 61 | 62 | 下面简单介绍膨胀和腐蚀的对偶性。膨胀和腐蚀相对于函数的补(补函数)和反射也是对偶的, 对偶关系为 63 | $$ 64 | \begin{aligned} 65 | & (f \oplus b)^{C}=f^{C} \ominus b^{V} \\ 66 | & (f \ominus b)^{C}=f^{C} \oplus b^{V} 67 | \end{aligned} 68 | $$ 69 | 70 | 这里函数的补定义为 71 | 72 | $$ 73 | f^{C}(x, y)=-f(x, y) 74 | $$ 75 | 76 | 而函数的反射定义为 77 | 78 | $$ 79 | b^{V}(x, y)=b(-x,-y) 80 | $$ 81 | 82 | ## 8.3.3 灰值开、闭运算 83 | 84 | 数学形态学中关于灰值开和闭运算的定义与它们在二值数学形态学中的对应运算是一致的。用结构元素b(灰值图像)对灰值图像f做开运算记为 $f \circ b ,$ 其定义为 85 | 86 | $$ 87 | f \circ b=(f \ominus b) \oplus b 88 | $$ 89 | 90 | 用结构元素 $b$ (灰值图像)对灰值图像f做闭运算记为 $f \bullet b$, 其定义为 91 | 92 | $$ 93 | f \bullet b=(f \oplus b) \ominus b 94 | $$ 95 | 96 | 开、闭运算相对于函数的补和反射也是对偶的, 对偶关系可写为 97 | 98 | $$ 99 | (f \circ b)^{C}=\left(f^{C} \circ b^{V}\right) 100 | $$ 101 | 102 | $$ 103 | (f \circ b)^{C}=\left(f^{C} \circ b^{V}\right) 104 | $$ 105 | 106 | 因为 $f(x, y)=-f(x, y)$, 所以式 (8-21) 和式 (8-22) 可写为 107 | 108 | $$ 109 | -(f \circ b)=\left(-f^C \subset \circ b^{V}\right) 110 | $$ 111 | 112 | $$ 113 | -(f \circ b)=\left(-f \circ b^{\vee}\right) 114 | $$ 115 | 116 | 灰值开、闭运算也有简单的几何解释, 如图8-20所示。在图(a)中, 给出了一幅图像 $f(x, y)$ 在 $y$ 为常数时的一个剖面 $f(x)$, 其形状为一连串的山峰山谷。假设结构元素 $b$ 是球状的, 投影到 $X$ 和 $f(x)$ 平面上是个圆。下面分别讨论开、闭运算的情况。 117 | 118 | 用 $b$ 对 $f$ 做开运算,即 $f \circ b$ ,可看作将 $b$ 贴着 $f$ 的下沿从一端滚到另一端。图8-20(b)给出了 $b$ 在开运算中的几个位置, 图8-20(c) 给出了开运算操作的结果。从图8-20(c) 可看出, 对所有比 $b$ 的直径小的山峰其高度和尖锐度都减弱了。换句话说, 当 $b$ 贴着 $f$ 的下沿滚动时, $f$ 中没有与 $b$ 接触的部位都削减到与 $b$ 接触。实际中常用开运算操作消除与结构元素相比尺寸较小的亮细节, 而保持图像整体灰度值和大的亮区域基本不受影响。具体地说就是, 第一步的腐蚀去除了小的亮细节并同时减弱了图像亮度, 第二步的膨胀增加了图像亮度, 但又不重新引入前面去除的细节。 119 | 120 | ![image-20230404144917453](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404144917453.png) 121 | 122 | 图8-20 灰值开、闭运算示意图 123 | 124 | 用 $b$ 对 $f$ 做闭运算, 即 $f \bullet b$, 可看作将 $b$ 贴着 $f$ 的上沿从一端滚到另一端。图8-20(d)给出了 $b$ 在闭运算操作中的几个位置, 图820(e)给出了闭运算操作的结果。从图8-20(e)可看出, 山峰基本没有变化, 而所有比 $b$ 的直径小的山谷得到了 “填充” 。换句话说, 当 $b$ 贴着 $f$ 的上沿滚动时, $f$ 中没有与b接触的部位都得到 “填充”,使其与b接触。实际中常用闭运算操作消除与结构元素相比尺寸较小的暗细节, 而保持图像整体灰度值和大的暗区域基本不受影响。具体说来, 第一步的膨胀去除了小的暗细节并同时增强了图像亮度, 第二步的腐蚀减弱了图像亮度但又不重新引入前面去除的细节。 125 | 126 | ![image-20230404145010183](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230404145010183.png) 127 | 128 | 图8-21 灰值开闭运算实例 129 | (a) 开运算的结果; (b) 闭运算的结果 130 | 131 | 利用最大最小值运算也可以把数学形态学的运算规见则从二值图像推广到灰值图像。为此下面引入集合的顶面 (Top surface of a set, 简㝍为 $T$ )和阴影 (Umbra of a surface, 简写为U) 的概念。为了易于表达,先考虑在空间平面 $xOy$ 上的一个区域 $A$ ,如图8-22所示。把 $A$ 向 $x$ 轴投影, 可得 $x \min$ 和 $x \max$ 。对属于 $A$ 的每个点 $(x, y)$ 来说,都有 $y=f(x)$ 成立。对 $A$ 来说,它在平面 $x O y$ 上有一条顶线 $T(\mathbf{A})$, 也就是 $A$ 的上边缘 $T(A) ,$ 它可表示为 132 | $$ 133 | T(A)=\left\{\left(x_{t}, y_{t}\right) \mid x_{\min } \leq x_{t} \leq x_{\max }, y_{t}=\max _{\left(x_{t}, y_{t}\right) \in A} f\left(x_{t}\right)\right\} 134 | $$ 135 | 136 | 137 | 138 | ![](https://cdn.mathpix.com/cropped/2023_03_29_a8c63bd14bed661f2d4fg-16.jpg?height=995&width=1572&top_left_y=309&top_left_x=525) 139 | 140 | 图 8-22 141 | 142 | 把 $T(A)$ 向 $X$ 轴投影得到 $F$ 。在 $T(A)$ 与 $F$ 之间的阴影就是 $U(A)$,阴影 $U(A)$ 也包括区域A。以上讨论可以方便地推广到空间Oxyz中去。一个二维灰值图像对应于 Oxyz上的一个体积 $V$, 它有一个顶面 $T(V)$, 也就是 $V$ 的上曲面。类似于式 (8-25), 这个顶面可以写为 143 | 144 | $$ 145 | \begin{aligned} 146 | & T(V)=\left\{\left(x_{t}, y_{t}, z_{t}\right) \mid x_{\min } \leq x_{t} \leq x_{\max }\right. \\ 147 | & y_{\min } \leq y_{t} \leq y_{\max }, z_{t}=\max _{\left(x_{t}, y_{t}, z_{t}\right) \in A} \{f\left(x_{t}, y_{t}\right)\} 148 | \end{aligned} 149 | $$ 150 | 151 | 根据灰值图像的顶面和阴影的定义, 如果把 $U(V)$ 以内当作“黑” 区, $U(V)$ 以外当作 “白” 区, 就可以把二值图像中的几个形态学运算符加以引申, 用到灰值图像中。如用 $f$ 表示灰值图像, 用 $b$ 表示灰值结构元素, 则将用 $b$ 对 $f$ 的腐蚀和膨胀分别定义为 152 | 153 | $$ 154 | \begin{aligned} 155 | & f \ominus b=T\{U(f) \ominus U(b)\} \\ 156 | & f \oplus b=T\{U(f) \oplus U(b)\} 157 | \end{aligned} 158 | $$ 159 | 160 | 161 | 按照开、闭运算的定义, 它们的实现可以参照腐蚀与膨胀的算法给出, 即对于开运算先腐蚀然后再膨胀, 对闭运算先膨胀然后再腐蚀。 -------------------------------------------------------------------------------- /digital-image-processing/II/2.6 实现图像变换的VC++编程.md: -------------------------------------------------------------------------------- 1 | # 2.6 用Matrix \C++ 库实现图像变换的VC++编程 2 | 3 | ## 2.6.1 Matrix\简介及其与VC++工程的集成 4 | 5 | ### Matrix\简介 6 | 7 | Matrix\C++数学库是MathTools公司利用Matcom技术开发的一个面向专业从事工程技术和科学计算人员的矩阵运算动态链接库。这个C++库提供了绝大多数的关于矩阵类、矩阵操作、 数值计算等函数的定义,它提供了一个双精度Matrix类型——Mm, 它可以定义的矩阵是复数矩阵、实数矩阵、稀疏矩阵甚至n维矩阵。同时还提供了近千个与矩阵运算相关的函数,并对如+、-、 *、 /、 ()等操作符进行了重载。库中所提供的函数涉及线性代数、多项式数学、信号处理、文件输入/输出、绘图等各个方面。充分利用这些库函数, 便可完成数字图像变换的各种操作。 8 | 9 | ### 在C++工程中集成Matrix\C++数学库 10 | 11 | 为了将Matrix\C++库集成到C++的工程文件中,需要做如下的操作: 12 | 13 | (1) 将库文件v4501v.lib库文件添加到C++的工程中; 14 | (2) 将库声明头文件matlib.h包含到工程中; 15 | (3) 初始化库; 16 | (4) 创建矩阵变量; 17 | (5) 访问矩阵单元; 18 | (6) 调用Matrix\C++库函数完成矩阵操作。 19 | 20 | 为了使读者掌握如何在VC++中使用Matrix\C++数学库的方法,下面详细介绍从创建工程到最后调用Matrix\C++库函数的全过程。 21 | 1) 创建一个新的VC++工程[HTSS] 22 | 在VC++中,采用默认选项创建一个MDI MFC工程。当然MatrixC++库可以用在任何其他类型的工程中,如Console 、 OWL、ActiveX等。 23 | 24 | 2) 将库文件添加到工程中 25 | 为使C++编译器能够将Matrix\C++库链接到最后的执行文件中去,必须将MatrixC++库加入到C++的工程文件中。用菜单命令Project/Add to Project/Files…将C:\matcom45\lib\v4501v.lib(如果v4501v.lib存在不同的文件夹中,请选择正确的路径)加入到C++工程中。 26 | 27 | 3) 包含matlib.h头文件 28 | 在要使用Matrix\C++库的.h或.cpp文件的头部, 将matlib.h头文件包含到工程中,即在使用Matrix\C++库的.h或.cpp文件头部添加如下代码: 29 | 30 | 31 | ```c++ 32 | #include"matlib.h" 33 | ``` 34 | 35 | 同时用菜单命令Tools/Options…/Directories设置matlib.h所在的路径,以便编译器能找到相应的头文件。 36 | 37 | 4. 初始化Matrix\C++库 38 | 39 | 调用Matrix\C++库函数之前,要用initM(MATCOM_VERSION)函数来初始化类库调用,并用exitM()函数来结束类库调用, 故还应在.cpp 中加入下列代码: 40 | 41 | ```c++ 42 | initM(MATCOM_VERSION); 43 | ...//用MatrixC++库函数的调用完成矩阵操作 44 | exitM(); 45 | ``` 46 | 47 | 当然可以在一个类的构造函数中添加 48 | 49 | ```c++ 50 | initM(MATCOM_VERSION); 51 | ``` 52 | 53 | 以完成类库的初始化工作。 54 | 55 | 可在该类的析构函数中添加 56 | 57 | ```c++ 58 | exitM() 59 | ``` 60 | 61 | 以完成结束类库调用的工作。 62 | 63 | MATCOM_VERSION参数是一个在matlib.h头文件中定义的值为4501的常量(不同版本其值有所差异), 它保证了动态链接库与matlib.h的匹配。 64 | 65 | 5) 创建矩阵变量 66 | 67 | 添加了Matrix\C++库后,可用关键字Mm来定义中矩阵类型变量, 例如: 68 | 69 | ```c++ 70 | Mm a,b,x; 71 | ``` 72 | 73 | 这条VC++语句在当前工程文件中创建了a、b、x三个矩阵变量,但这时a、b和x还只是空的矩阵, 它们的矩阵单元还不包含任何的值。 74 | 75 | 6) 访问矩阵单元 76 | 77 | ​ 矩阵单元的访问包括读和写操作,主要有:通过.r()来访问矩阵的实部,通过.i()来访问矩阵的虚部; 通过BR()函数把一个数据列表赋给矩阵各个单元;通过.addr()或.addi()返回矩阵变量的实部或虚部的内存指针来完成对矩阵单元的访问。 78 | 79 | ### 安装与Matrix\C++库对应的动态链接库 80 | 81 | 当采用Matrix\C++数学库完成矩阵的运算时, 要求系统中有相关的ago4501.dll, v4501v.dll, opengl32.dll和glu32.dll四个动态链接库文件。如果系统中安装有Matcom4.5,这些动态链接库文件将会自动安装在window\system\或window\system32\下, 如果系统没有安装Matcom4.5, 只需将这四个动态链接库文件拷贝到相应目录下即可。 82 | 83 | ## 2.6.2 创建图像数据矩阵 84 | 85 | 为利用矩阵运算完成图像变换, 首先应将其图像数据赋给矩阵变量。 86 | 87 | 设指针pBits指向读入内存中的图像数据首地址, 可用如下代码将图像数据赋给矩阵变量(为简单起见, 设图像为8位灰度图像)。 88 | 89 | ### 在类定义头文件.h中定义矩阵变量 90 | 91 | ```c++ 92 | Mm m_matBits; 93 | ``` 94 | 95 | ### 在类实现文件.cpp中完成对矩阵变量的赋值操作 96 | 97 | ```c++ 98 | //图像数据总字节数, 其中nWidthBytes为每行图像数据占用的字节数 99 | DWORD SizeImage = nWidthBytes * nHeight; 100 | //通过创建一个1×SizeImage的一维0矩阵, 为矩阵变量分配内存 101 | m_matBits = zeros(1, SizeImage); 102 | //将矩阵由double型转换为unsigned char型, 以便将图像数据赋给矩阵 103 | m_matBits = muint8(m_matBits); 104 | //首先利用m_matBits.addr()获得矩阵实部的内存指针, 然后利用memcpy()将图像数据一次性 105 | 106 | //赋给矩阵变量 107 | memcpy(m_matBits.addr(), pBits, SizeImage); 108 | //由于Mm型的矩阵在内存中是按先列后行的顺序存储的, 因此, 应先用MatrixC++的库 109 | //函数reshape()将一维矩阵m_matBits变为nHeight×nWidthBytes的二维矩阵, 再用rot90()函数 110 | 111 | //将其逆时针旋转90°, 将矩阵变为nWidthBytes×nHeight的二维矩阵 112 | m_matBits = rot90(reshape(m_matBits, nWidthBytes, nHeight)); 113 | //若图像宽度与其字节宽度不同, 则将由系统补齐的每行字节数为4的整数倍的各列0删除,以减小矩阵大小加快处理速度 114 | if(nWidthBytes != nWidth) 115 | { 116 | m_matBits = m_matBits(c_p, colon(1, 1, nWidth)); 117 | } 118 | //将矩阵由unsigned char型转换为double型, 以便进行运算 119 | m_matBits = mdouble(m_matBits); 120 | ``` 121 | 122 | ## 2.6.3 将矩阵数据赋给图像数据区 123 | 124 | 为使数据符合图像文件格式,还应将处理后的矩阵数据赋给图像数据区,其代码如下: 125 | 126 | ```c++ 127 | //检查m_matBits矩阵是否为空 128 | if(isempty(m_matBits) == 1) 129 | { 130 | return FALSE; 131 | } 132 | //将矩阵数据范围限定于0~255之间 133 | m_matBits = mabs(m_matBits); 134 | Mm L = m_matBits > 255.0; 135 | Mm NotL = !L; 136 | m_matBits = times(m_matBits, NotL) + L * 255.0; 137 | 138 | //将矩阵由double型转换为unsigned char型, 以便将图像数据赋给矩阵 139 | m_matBits = muint8(m_matBits); 140 | //计算nWidth/4的余数 141 | int nTmp = (int)rem(nWidth, 4); 142 | int nPadding; 143 | //为矩阵各列补0, 以使其为符合4的整数倍 144 | if(nTmp > 0) 145 | { 146 | nPadding = 4 - nTmp; 147 | m_matBits = cat(2, m_matBits, 148 | repmat(muint8(0), (BR(size(m_matBits, 1)), nPadding))); 149 | } 150 | //将矩阵顺时针旋转90° 151 | m_matBits = rot90(m_matBits, -1); 152 | //将图像数据赋绘矩阵 153 | memcpy(pBits, m_matBits.addr(), (nWidthBytes * nHeight)*sizeof(unsigned char)); 154 | ``` 155 | 156 | ## 2.6.4 利用矩阵运算进行图像变换 157 | 158 | 图像数据矩阵建立后,便可利用Matrix\C++的库函数通过各种矩阵运算完成图像变换的工作。 159 | ### 离散傅立叶变换 160 | 161 | trix\C++的库提供了函数dft()、fft()和fft2()分别用于完成一维DFT、 一维FFT和二维FFT运算,函数ifft()和ifft2()用于完成一维FFT和二维FFT的逆傅立叶变换。在图像处理中常用的函数是fft2()和ifft2(),利用这两个函数便可分别完成图像的正、反傅立叶变换。其核心代码如下: 162 | 163 | ```c++ 164 | //调用MatrixC++库函数fft2()完成二维离散傅立叶变换 165 | Mm ff = fft2(m_matBits); 166 | //调用MatrixC++库函数fftshift()将频域中心移到矩阵中心 167 | ff = fftshift(ff); 168 | //调用MatrixC++库函数mabs()计算频谱 169 | m_matBits = mabs(ff); 170 | ``` 171 | 172 | ### 离散余弦变换 173 | 174 | 在Matrix\C++库中并未提供离散余弦变换函数,因此需要编写相应的变换函数。由式(7-61)和式(7-63)可知, 利用离散傅立叶正反变换便可完成离散余弦正反变换,实际上Matlab提供的dct()、 idct()、 dct2()和idct2()函数就是如此完成离散余弦正反变换的。仔细阅读相应的.m文件便可得出其实现变换的过程, 这样就可以编写用以完成一维DCT函数dct()的代码。完成一维离散余弦变换函数dct()后,利用二维DCT的可分离性,便可方便的编制出用于二维离散余弦变换函数dct2()。其核心代码为 175 | 176 | ```c++ 177 | b = transpose(dct(transpose(dct(arg1)))); 178 | ``` 179 | 180 | 其中, arg1为待变换矩阵。 181 | 182 | ​ 同理, 可编制出一维IDCT函数变换idct()和二维IDCT函数idct2()。 183 | 184 | ​ 与图像的离散傅立叶变换类似, 实现图像的离散余弦变换的代码如下: 185 | 186 | ```c++ 187 | Mm ff = dct2(m_matBits); 188 | //调用MatrixC++库函数mabs()计算频谱 189 | m_matBits = mabs(ff); 190 | ``` 191 | 192 | ### 离散沃尔什-哈达玛变换 193 | 194 | 同样,在Matri\C++库中并未提供离散沃尔什-哈达玛变换的函数,但它提供了用于产生哈达玛矩阵的函数hadamard(), 其语法为 195 | 196 | ```c++ 197 | H=hadamard(N); 198 | ``` 199 | 200 | 其中的元素为1或-1, 注意该矩阵只有当n或n/12或n/20为2的整次幂时才存在。 201 | 202 | ​ 利用矩阵形式的WHT, 可由如下代码完成离散沃尔什-哈达玛变换: 203 | 204 | ```c++ 205 | //获得矩阵的行数和列数 206 | Mm mSize = size(m_matBits); 207 | //生成哈达玛矩阵 208 | Mm HColum = hadamard(mSize.r(1, 1)); 209 | Mm HRow = hadamard(mSize.r(1, 2)); 210 | //进行离散哈达玛变换 211 | Mm ff = HRow * m_matBits * HColum; 212 | //调整系数以便以图像方式显示结果 213 | ff = ff * 1000/(mSize.r(1, 1)*mSize.r(1, 2)); 214 | //调用MatrixC++库函数mabs()计算频谱 215 | m_matBits = mabs(ff); 216 | ``` -------------------------------------------------------------------------------- /digital-image-processing/VI/6.2 图像比例缩放.md: -------------------------------------------------------------------------------- 1 | # 6.2 图像比例缩放 2 | 3 | ## 6.2.1 图像比例缩放变换 4 | 5 | 图像比例缩放是指将给定的图像在x轴方向按比例缩放 $f x$ 倍, 在 $y$ 轴方向按比例缩放 $f y$ 倍, 从而获得一幅新的图像。如果 $f x=f y$, 即在 $x$ 轴方向和 $y$ 轴方向缩放的比率相同, 称这样的比例缩放为图像的全比例缩放。如果 $f x \neq f y$, 图像的比例缩放会改变原始图像的像素间的相对位置, 产生几何畸变。设原图像中的点 $P_0\left(x_0, y_0\right)$ 比例缩放后, 在新图像中的对应点为 $P(x, y)$, 则 $P_0\left(x_0, y_0\right)$ 和 $P(x, y)$ 之间的对应关系如图6-3所示。 6 | 7 | image-20230328150211842 8 | 9 | 图6-3 比例缩放 10 | 11 | 比例缩放前后两点 $P_0\left(x_0, y_0\right) 、 P(x, y)$ 之间的关系用矩阵形式可以表示为 12 | $$ 13 | \left[\begin{array}{l} 14 | x \\ 15 | y \\ 16 | 1 17 | \end{array}\right]=\left[\begin{array}{lll} 18 | f x & 0 & 0 \\ 19 | 0 & f x & 0 \\ 20 | 0 & 0 & 0 21 | \end{array}\right]\left[\begin{array}{l} 22 | x_0 \\ 23 | y_0 \\ 24 | 1 25 | \end{array}\right]\tag{6-1} 26 | $$ 27 | 公式 (6-1) 的逆运算为 28 | $$ 29 | \left[\begin{array}{l} 30 | x_0 \\ 31 | y_0 \\ 32 | 1 33 | \end{array}\right]=\left[\begin{array}{lll} 34 | \frac{1}{f x} & 0 & 0 \\ 35 | 0 & \frac{1}{f x} & 0 \\ 36 | 0 & 0 & 1 37 | \end{array}\right]\left[\begin{array}{l} 38 | x_0 \\ 39 | y_0 \\ 40 | 1 41 | \end{array}\right] 42 | $$ 43 | 即 44 | $$ 45 | \left\{\begin{array}{l} 46 | x_0=\frac{x}{f x} \\ 47 | y_0=\frac{y}{f y} 48 | \end{array}\right. 49 | $$ 50 | 比例缩放所产生的图像中的像素可能在原图像中找不到相应的像素点,这样就必须进行插值处理。插值处理常用的方法有两种, 一种是直接赋值为和它最相近的像素值, 另一种是通过一些插值算法来计算相应的像素值。前一种方法计算简单, 但会出现马赛克现象;后者处理效果要好些,但是运算量也相应增加。 在下面的算法中直接采用了前一种做法。实际上,这也是一种插值算法, 称为最邻近插值法(Nearest Neighbor Interpolation) 51 | 52 | 下面首先讨论图像的比例缩小。最简单的比例缩小是当 fx=fy=1/2时,图像被缩到一半大小,此时缩小后图像中的(0, 0)像素对应于原图像中的(0, 0)像素; (0, 1)像素对应于原图像中的(0, 2)像素; (1, 0)像素对应于原图像中的(2, 0)像素, 依此类推。图像缩小之后,因为承载的信息量小了,所以画布可相应缩小。此时, 只需在原图像基础上,每行隔一个像素取一点,每隔一行进行操作,即取原图的偶(奇)数行和偶(奇)数列构成新的图像,如图6-4所示。如果图像按任意比例缩小, 则需要计算选择的行和列 53 | 54 | image-20230328150350082 55 | 56 | 如果$M×N$大小的原图像$F(x,y)$缩小为 $kM×kN$大小$(k<1)$ 的新图像$I(x,y)$时,则 57 | $$ 58 | I(x, y)=F(\operatorname{int}(c \times x), \operatorname{int}(c \times y)) 59 | $$ 60 | 其中, $c=1/k$。由此公式可以构造出新图像,如图6-5所示。 61 | 62 | ![image-20230328150453396](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230328150453396.png) 63 | 64 | 图6-5 图像按任意比例缩小 65 | 66 | 当 $f x \neq f y(f x, f y>0)$ 时, 图像不按比例缩小, 这种操作因为在 $x$ 方向和y方向的缩小比例不同, 一定会带来图像的几何畸变。图像不按比例缩小的方法是: 如果 $M \times N$ 大小的旧图 $F(x, y)$ 缩小为 $k_1 M \times k_2 N\left(k_1<1, k_2<1\right)$ 大小的新图像 $I(x, y)$ 时, 则 67 | $$ 68 | I(x, y)=F\left(\operatorname{int}\left(c_1 \times x\right), \operatorname{int}\left(c_2 \times y\right)\right) 69 | $$ 70 | 其中 71 | $$ 72 | c=\frac{1}{k_1}, c_2=\frac{1}{k_2} 73 | $$ 74 | 由此公式可以构造出新图像。 75 | 76 | 图像在缩小操作中, 是在现有的信息里如何挑选所需要的有用信息。而在图像的放大操作中, 则需要对尺寸放大后所多出来的空格填入适当的像素值, 这是信息的估计问题, 所以较图像的缩小要难一些。当 $f x=f y=2$ 时, 图像被按全比例放大 2 倍, 放大后图像中的 $(0,0)$ 像素对应于原图中的 $(0,0)$ 像素; $(0,1)$ 像素对应于原图中的 $(0,0.5)$ 像素, 该像素不存在, 可以近似为 $(0,0)$ 也可以近似 $(0,1) ; \quad(0,2)$ 像素对应于原图像中的 $(0,1)$ 像素; $(1,0)$ 像素对应于原图中的 $(0.5,0)$, 它的像素值近似于 $(0,0)$ 或 $(1,0)$ 像素; (2,0)像素对应于原图中的 $(1,0)$ 像素, 依此类推。其实这是将原图像每行中的像素重复取值一遍, 然后每行重复一次。图66是原始图像, 图6-7和图6-8是分别采用上述两种近似方法放大后的图像。 77 | 78 | image-20230328150656606 79 | 80 | 图6-6 放大前的图像 81 | 82 | image-20230328150707714 83 | 84 | 图6-7 按最近邻域法放大两倍的图像 85 | 86 | image-20230328150716930 87 | 88 | 图6-8 按插值法放大两倍的图像 89 | 90 | 一般地, 按比例将原图像放大 $k$ 倍时, 如果按照最近邻域法则需要将一个像素值添在新图像的 $k \times k$ 的子块中, 如图6-9所示。 显然, 如果放大倍数太大, 按照这种方法处理会出现马赛克效应。当 $f x \neq f y(f x, f y>0)$ 时, 图像在 $x$ 方向和 $y$ 方向不按比例放大, 此时, 这种操作由于 $x$ 方向和 $y$ 方向的放大倍数不同, 一定带来图像的几何畸变。放大的方法是将原图像的一个像素添到新图像的一个 $k_1 \times k_2$ 的子块中去。为了提高几何变换后的图像质量, 常采用线性揷值法。该方法的原理是, 当求出的分数地址与像素点不一致时, 求出周围四个像素点的距离比, 根据该比率, 由四个邻域的像素灰度值进行线性揷值, 如图6-10所示。 91 | 92 | image-20230328150808789 93 | 94 | 图6-9 按最近邻域法放大五倍的图像 95 | 96 | image-20230328150816370 97 | 98 | 图6-10 线性插值法示意图 99 | 100 | 简化后的灰度值计算式如下: 101 | $$ 102 | \begin{aligned} 103 | & g(x, y)=(1-q)\{(1-p) \times g([x],[y])+p \times g([x] \\ 104 | & +1,[y])\}+q\{(1-p) \times g([x],[y]+1)+p \times g([x] \\ 105 | & +1,[y]+1)\} 106 | \end{aligned} 107 | $$ 108 | 式中: $g(x, y)$ 为坐标 $(x, y)$ 处的灰度值, $[x]$ 、 $[y]$ 分别为不大于 $x, y$ 的整数。关于这个问题的详细算法及其实现, 读者可以参考有关参考文献。 109 | 110 | ## 6.2.2 比例缩放的实现 111 | 112 | image-20230328151005743 113 | 114 | 图6-11 图像比例缩放处理结果 115 | 116 | 下面给出这个函数的框架和主要算法。 117 | 118 | ```c 119 | //***************************************** 120 | //函数名称: BOOL ZoomImage() 121 | //基本功能: 本函数对传入的CDibObject对象中的图像进行缩放操作 122 | //参数说明: float fXZoomRatio X轴方向缩放比率 123 | // float fYZoomRatio Y轴方向缩放比率 124 | // BOOL bBilinear TRUE为双线性插值, FALSE为最邻近插值 125 | // CDibObject *pDibObject 默认为NULL 126 | //返回值: BOOL 成功返回TRUE, 失败返回FALSE 127 | //***************************************** 128 | BOOL CGeoTrans:: ZoomImage(float fXZoomRatio, float fYZoomRatio,  129 | BOOL bBilinear, CDibObject *pDibObject) 130 | { 131 | //获得图像宽度和高度, 计算缩放后的图像实际宽度 132 | nNewWidth = (int)(nOldWidth * fXZoomRatio + 0.5); 133 | nNewHeight = (int)(nOldHeight * fYZoomRatio + 0.5); 134 | //获取源图像指针,为新图像分配内存,用白色填充新图像数据区,调整新图像信息 135 | //由图像位数确定的移动字节数nMovedBits 136 | //针对图像每行进行操作 137 | for(y = 0; y < nNewHeight; y++) 138 | { 139 | //指向新图像第y行 140 | pNewTemp = pNewBits; 141 | pNewTemp += (nNewHeight -1[KG*3]-y) * nNewWidthBytes; 142 | //针对图像每列进行操作 143 | for(x = 0; x < nNewWidth; x++) 144 | { 145 | //计算该像素在源图像中的坐标 146 | int y0 = (long) (y/fYZoomRatio +0.5); 147 | int x0 = (long) (x/fXZoomRatio +0.5); 148 | //判断是否在源图范围内 149 | if( (x0 >= 0) && (x0 < nOldWidth) && (y0 >= 0) && (y0 < nOldHeight)) 150 | { 151 | if(bBilinear) 152 | { 153 | //双线性插值 154 | } 155 | else 156 | { 157 | //指向源图像第y0行, 第x0个像素 158 | pOldTemp = pOldBits; 159 | pOldTemp += (nOldHeight - 1 - y0) * nOldWidthBytes; 160 | pOldTemp += x0 * nMovedBits; 161 | memcpy(pNewTemp, pOldTemp, nMovedBits); 162 | } 163 | } 164 | pNewTemp += nMovedBits; 165 | } 166 | } 167 | //将内存解锁和将不再使用的内存释放, 将新图像设置为当前图像 168 | return TRUE; 169 | } 170 | 171 | ``` 172 | 173 | -------------------------------------------------------------------------------- /digital-image-processing/III/3.11 JPEG编码.md: -------------------------------------------------------------------------------- 1 | # 3.11 JPEG 编码 2 | 3 | ## 3.11 JPEG基本系统编码 4 | 5 | ​ JPEG是面向静态图像编码的国际标准。在相同图像质量条件下, JPEG文件拥有比其他图像文件格式更高的压缩比。JPEG目前被广泛应用于多媒体和网络程序中,是现今万维网中使用最广泛的两种图像文件格式之一。JPEG是一种有损压缩, 即在压缩过程中会丢失数据,每次编辑JPEG图像后,图像就会被重复压缩一次, 损失就会有所增加。 6 | 7 | JPEG允许四种编码模式: 8 | (1) 顺序式(Sequential)DCT方式:从左到右、从上到下对图像顺序进行基于离散余弦变换(DCT)的编码。DCT理论上是可逆的,但在计算时存在误差,因而基于DCT的编码模式是一种有损编码。 9 | 10 | (2) 渐进式(Progressive)DCT方式:基于DCT,对图像分层次进行处理,从模糊到清晰地传输图像(与GIF文件的交错方式类似)。有两种实现方法,一种是频谱选择法,即按Z形扫描的序号将DCT量化序数分成几个频段,每个频段对应一次扫描, 每块均先传送低频扫描数据,得到原图概貌,再依次传送高频扫描数据,使图像逐渐清晰;另一种是逐次逼近法,即每次扫描全部DCT量化序数,但每次的表示精度逐渐提高。 11 | (3) 无失真(Lossless)方式: 使用线性预测器,如DPCM, 而不是基于DCT。 12 | 13 | (4) 分层(Hierarchical)方式: 在空间域将源图像以不同的分辨率表示,每个分辨率对应一次扫描, 处理时可以基于DCT或预测编码,可以是渐进式,也可以是顺序式。 14 | JPEG定义了三种系统:基本系统(Baseline System)、扩展系统(Extended System)和无失真压缩系统(Lossless System)。一个符合JPEG标准的编解码器至少要满足基本系统的技术指标。 15 | 基本的JPEG算法属于变换类编码,下面针对基于DCT的顺序式基本系统编码来说明JPEG的编码方法。 16 | 17 | ![image-20230419203131892](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203131892.png) 18 | 19 | 图3-3 JPEG 编码流程图 20 | 21 | 1) 数据分块 22 | 对图像进行编码前, 将每个分量图像分割成不重叠的 $8 \times 8$ 像素块, 每一个 $8 \times 8$ 像素块称为一个数据单元 (DU)。在彩色图像中, JPEG分别压缩图像的每个彩色分量。虽然JPEG可以压缩通常的红绿蓝分量, 但在 $Y_{b} C_{r}$ 空间的压缩效果会更好。 这是因为人眼对色彩的变化不如对亮度的变化敏感, 因而对色彩的编码可以比对亮度的编码粗糙些, 这主要体现在不同的采样频率和量化精度上。因此, 编码前一般先将图像从RGB空间转换到 $YC_{b} C_{i}$ 空间,再把各分量图像分割成 $8 \times 8$ 数据块。 23 | 24 | 在对图像采样时, 可以采用不同的采样频率, 这种技术称为二次采样。由于亮度比色彩更重要, 因而对 $Y$ 分量的采样频率可高于对 $C_{b} 、 C_{r}$ 的采样频率, 这样有利于节省存储空间。常用的采样方案有YUV422和YUV411。把采样频率最低的分量图像中一个DU所对应的像区上覆盖的所有各分量上的DU按顺序编组为一个最小编码单元 (MCU)。对灰度图像而言, 只有一个Y分量, MCU就是一个数据单元。而对彩色图像而言, 以 4:1:1的采样方案为例, 则一个MCU由4个 4 分量的DU、 1 个 $C_{b}$ 分量的DU和1个 $C_{r}$ 分量的DU组成。 25 | 26 | 2) DCT处理 27 | 图像数据块分割后, 即以 MCU为单位顺序将DU进行二维离散余弦变换。对以无符号数表示的具有 $P$ 位精度的输入数据, 在DCT前要减去 $2^{P-1}$, 转换成有符号数, 而在IDCT后, 应加上 $2^{P-1}$, 转换成无符号数。对每个 $8 \times 8$ 的数据块 $DU$ 进行 $DCT$ 后, 得到的64个系数代表了该图像块的频率成分,其中低频分量集中在左上角, 高频分量分布在右下角。系数矩阵左上角的叫做直流(DC)系数,它代表了该数据块的平均值, 其余 63 个叫交流(AC)系数。 28 | 29 | 3) 系数量化 30 | 在DCT处理中得到的64个系数中,低频分量包含了图像亮度等主要信息。在从空间域到频域的变换中,图像中的缓慢变化比快速变化更易引起人眼的注意, 所以在重建图像时,低频分量的重要性高于高频分量。因而在编码时可以忽略高频分量, 从而达到压缩的目的,这也是量化的根据和目的。 31 | 32 | ​ 在JPEG标准中,用具有64个独立元素的量化表来规定DCT域中相应的64个系数的量化精度,使得对某个系数的具体量化阶取决于人眼对该频率分量的视觉敏感程度。理论上,对不同的空间分辨率、数据精度等情况,应该有不同的量化表。不过,一般采用图3-4和图3-5所示的量化表,可取得较好的视觉效果。之所以用两张量化表,是因为Y分量比Cb和Cr更重要些,因而对Y采用细量化,而对Cb和Cr采用粗量化。量化就是用DCT变换后的系数除以量化表中相对应的量化阶后四舍五入取整。由于量化表中左上角的值较小,而右下角的值较大, 因而起到了保持低频分量、 抑制高频分量的作用。 33 | 34 | ![image-20230419203258219](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203258219.png) 35 | 36 | 图3-4 亮度量化表 37 | 38 | ![image-20230419203308344](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203308344.png) 39 | 40 | 图3-5 色度量化表 41 | 42 | 4) Z形扫描 43 | DCT系数量化后,构成一个稀疏矩阵,用Z(Zigzag)形扫描将其变成一维数列,将有利于熵编码。Z形扫描的顺序如图3-6所示。 44 | 45 | ![image-20230419203321662](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203321662.png) 46 | 47 | 图3-6 DCT系数的Z形扫描顺序 48 | 49 | ​ 5) DC系数编码 50 | 51 | ​ DC系数反映了一个8×8数据块的平均亮度,一般与相邻块有较大的相关性。JPEG对DC系数作差分编码,即用前一数据块的同一分量的DC系数作为当前块的预测值,再对当前块的实际值与预测值的差值作哈夫曼编码。 52 | 53 | ​ 若DC系数的动态范围为-1024~+1024,则差值的动态范围为-2047~+2047。如果为每个差值赋予一个码字, 则码表过于庞大。因此,JPEG对码表进行了简化,采用“前缀码(SSSS)+尾码”来表示。前缀码指明了尾码的有效位数B, 可以根据DIFF从表3-8中查出前缀码对应的哈夫曼编码。尾码的取值取决于DC系数的差值和前缀码。如果DC系数的差值DIFF大于等于0,则尾码的码字为DIFF的B位原码;否则,取DIFF的B位反码。 54 | 55 | 表3-8 图像分量为8位时DC系数差值的典型哈夫曼编码表 56 | 57 | ![image-20230419203426825](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203426825.png) 58 | 59 | 6) AC系数编码 60 | 经Z形排列后的AC系数,更有可能出现连续0组成的字符串, 从而对其进行行程编码将有利于压缩数据。JPEG将一个非零DC系数及其前面的0行程长度(连续0的个数)的组合称为一个事件。将每个事件编码表示为“NNNN/SSSS+尾码”, 其中, NNNN为0行程的长度,SSSS表示尾码的有效位数B(即当前非0系数所占的比特数),如果非零AC系数大于等于0, 则尾码的码字为该系数的B位原码, 否则, 取该系数的B位反码。 61 | 由于只用4位表示0行程的长度,故在JPEG编码中,最大0行程只能等于15。当0行程长度大于16时,需要将其分开多次编码, 即对前面的每16个0以“F/0”表示,对剩余的继续编码。 62 | 63 | 表3-9 AC系数的尾码位数表 64 | 65 | | SSSS | AC系数的尾码位数表 | 66 | | ---- | -------------------- | 67 | | 0 | 0 | 68 | | 1 | -1,1 | 69 | | 2 | -3, -2, 2, 3 | 70 | | 3 | -7~-4, 4~7 | 71 | | 4 | -15~-8, 8~15 | 72 | | 5 | -31~-16, 16~31 | 73 | | 6 | -63~-17, 17~63 | 74 | | 7 | -127~-64, 64~127 | 75 | | 8 | -255~-128, 128~255 | 76 | | 9 | -511~256, 256~511 | 77 | | 10 | -1023~-512, 512~1023 | 78 | 79 | 表3-10 亮度AC系数码表 80 | 81 | ![image-20230419203504472](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203504472.png) 82 | 83 | ![image-20230419203515866](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203515866.png) 84 | 85 | ![](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203515866.png) 86 | 87 | 表3-11 色差AC系数编码 88 | 89 | ![image-20230419203536714](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203536714.png) 90 | 91 | ![](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203536714.png) 92 | 93 | ![](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203536714.png) 94 | 95 | 3.11.2 JPEG编码实例 96 | 下面结合一个实例来讲述JPEG基本系统的编码过程。设有一图像亮度数据块如图3-7所示,对其进行离散余弦变换后, 用图3-4所示的亮度量化表对系数矩阵量化后的结果如图3-8所示。对量化结果按图3-6所示的顺序进行Z形扫描, 并对扫描结果的DC及AC系数进行编码的结果见表3-12。由于数据较多, 为简便起见, 这里只对几个系数的编码加以说明。 97 | 98 | ![image-20230419203603903](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203603903.png) 99 | 100 | 图3-7 源图像亮度数据块 101 | 102 | ![image-20230419203617741](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203617741.png) 103 | 104 | 图3-8 量化结果 105 | 106 | 表3-12 Zigzag排列及行程编码与哈夫曼编码(VLC)结果 107 | 108 | ![image-20230419203647296](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203647296.png) 109 | 110 | 表3-12 Zigzag排列及行程编码与哈夫曼编码(VLC)结果 111 | 112 | ![image-20230419203658730](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203658730.png) 113 | 114 | 1) DC系数的编码 115 | 在量化系数矩阵的Z形扫描结果中,第一个系数为DC系数。假设前一亮度数据块的DC系数为40, 则差值DIFF=44-40=4, 因4在(-7~-4, 4~7)范围内, 由表3-8查得SSSS=3,其前缀码字为“100”, 3位尾码即为4的二进制原码“100”, 从而DC系数的编码为“100100”。如果前一数据块的DC系数为48, 则DIFF=-4, 由表10-8查得SSSS及前缀码字同上,其3位尾码即-4的反码“011”, 因此DC系数的编码为“100011”。解码时, 由前缀码“100”可知尾码有3位,若前缀码字是“100”, 因其最高位为1,故可得DC系数的差值为4; 若前缀码字为“011”,因最高位为0,知其为负, 故取反后可得差值为-4。 116 | 117 | 2) AC系数的编码 118 | 在Z形扫描结果中,第一个非零AC系数为10。在它前面的连零个数为1, 即NNNN=1。根据AC系数10从表3-9查得SSSS=4, 由NNNN/SSSS=1/4从表3-10查得其哈夫曼码字为“111110110”, 而10的二进制码为“1010”, 因此该AC系数的编码为“1111101101010”。由于篇幅所限,其他AC系数的编码就不再赘述, 结果见表10-12。在Z形扫描结果中的末尾,除第54个系数非零外, 其他系数全为零, 故直接用一个结束块“EOB(0/0)”结束本块,由表3-10查得其码字为“1010”。于是,最后该亮度块的编码为(其中,假定差值为4)100100111110110101001100111110000101010001001101100100010011101010000110001010000110001111000000000001000111000110001100100000111001001001111001000001111001111101111010,共用了168位,而原始图像块需8×8×8=512位,因此压缩比为3.048。 119 | 120 | JPEG压缩编码示例 121 | 122 | ![image-20230419203739140](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230419203739140.png) -------------------------------------------------------------------------------- /digital-image-processing/II/2.5 离散沃尔什-哈达玛变换(WHT).md: -------------------------------------------------------------------------------- 1 | # 2.5 离散沃尔什-哈达玛变换(WHT) 2 | 3 | ## 2.5.1 一维离散沃尔什-哈达玛变换 4 | 5 | ### 沃尔什函数 6 | 7 | 沃尔什函数是1923年由美国数学家沃尔什提出的。沃尔什函数系是一个完备正交函数系, 其值只能取 +1 和 -1 。从排列次序上可将沃尔什函数分为三种定义方法: 一种是按照沃尔什排列来定义 (按列率排序) ; 另一种是按照佩利排列来定义(按自然排序);第三种是按照哈达玛排列来定义。由于哈达玛排序的沃尔什函数是由 $2^{n}(n=0,1,2, \ldots)$ 阶哈达玛矩阵 (Hadamard Matrix) 得到的, 而哈达玛矩阵的最大优点在于它具有简单的递推关系, 即高阶矩阵可用两个低阶矩阵的克罗内克积求得, 因此在此只介绍哈达玛排列定义的沃尔什变换。 8 | 9 | $N=2^{n}(n=0,1,2, \ldots)$ 阶哈达玛矩阵每一行的符号变化规律对应于某一个沃尔什函数的符号变化规律, 即 $N=2 n(n=0,1,2, \ldots)$ 阶哈达玛矩阵的每一行对应于一个离散沃尔什函数, 哈达玛矩阵与沃尔什函数系不同之处仅仅是行的次序不同。 $2^{n}$ 阶哈达玛矩阵有如下形式: 10 | $$ 11 | H_{1}=\text { [1] }\tag{2-64} 12 | $$ 13 | 14 | $$ 15 | H_{2}=\left[\begin{array}{rr} 16 | 1 & 1 \\ 17 | 1 & -1 18 | \end{array}\right]\tag{2-65} 19 | $$ 20 | 21 | $$ 22 | H_{4}=\left[\begin{array}{rr} 23 | H_{2} & H_{2} \\ 24 | H_{2} & -H_{2} 25 | \end{array}\right]=\left[\begin{array}{rrrr} 26 | 1 & 1 & 1 & 1 \\ 27 | 1 & -1 & 1 & -1 \\ 28 | 1 & 1 & -1 & -1 \\ 29 | 1 & -1 & -1 & 1 30 | \end{array}\right]\tag{2-66} 31 | $$ 32 | 33 | 哈达玛矩阵的阶数是按 $N=2^{n}(n=0,1,2, \ldots)$ 规律排列的, 阶数较高的哈达玛矩阵, 可以利用矩阵的克罗内克积运算, 由低阶哈达玛矩阵递推得到, 即 34 | 35 | $$ 36 | H_{N}=H_{2^{n}}=H_{2} \otimes H_{2^{n-1}}=\left[\begin{array}{cc} 37 | H_{2^{n-1}} & H_{2^{n-1}} \\ 38 | H_{2^{n-1}} & -H_{2^{n-1}} 39 | \end{array}\right]=\left[\begin{array}{cc} 40 | H_{\frac{N}{2}} & H_{\frac{N}{2}} \\ 41 | H_{\frac{N}{2}} & -H_{\frac{N}{2}} 42 | \end{array}\right]\tag{2-67} 43 | $$ 44 | 45 | 46 | 47 | 矩阵的克罗内克积 (Kronecker Product) 运算用符号记作$A \odot B$, 其运算规律如下: 48 | 49 | 设 50 | 51 | $$ 52 | A=\left[\begin{array}{llll} 53 | a_{11} & a_{12} & \cdots & a_{1 n} \\ 54 | a_{21} & a_{22} & \cdots & a_{2 n} \\ 55 | \vdots & \vdots & \ddots & \vdots \\ 56 | a_{m 1} & a_{m 2} & \cdots & a_{mn} 57 | \end{array}\right]&& 58 | B=\left[\begin{array}{rrrr} 59 | b_{11} & b_{12} & \cdots & b_{1 j} \\ 60 | b_{21} & b_{22} & \cdots & a_{2 j} \\ 61 | \vdots & \vdots & \ddots & \vdots \\ 62 | b_{i 1} & b_{i 2} & \cdots & b_{i j} 63 | \end{array}\right] 64 | $$ 65 | 66 | $$ 67 | 68 | $$ 69 | 70 | 则 71 | 72 | $$ 73 | A \otimes B=\left[\begin{array}{llll} 74 | a_{11} B & a_{12} B & \cdots & a_{1 n} B \\ 75 | a_{21} B & a_{22} B & \cdots & a_{2 n} B \\ 76 | \vdots & \vdots & \ddots & \vdots \\ 77 | a_{m 1} B & a_{m 2} B & \cdots & a_{m n} B 78 | \end{array}\right] \\ 79 | 80 | \tag{2-68} 81 | $$ 82 | 83 | $$ 84 | B \otimes A=\left[\begin{array}{cccc} 85 | b_{11} A & b_{12} A & \cdots & b_{1 j} A \\ 86 | b_{21} A & b_{22} A & \cdots & b_{2 j} A \\ 87 | \vdots & \vdots & \ddots & \vdots \\ 88 | b_{i 1} A & a_{i 2} A & \cdots & b_{i j} A 89 | \end{array}\right]\tag{2-69} 90 | $$ 91 | 92 | 93 | 94 | ### 离散沃尔什-哈达玛变换 95 | 96 | 一维离散沃尔什变换定义为 97 | 98 | $$ 99 | W(u)=\frac{1}{N} \sum_{x=0}^{N-1} f(x) W a l s h(u, x)\tag{2-70} 100 | $$ 101 | 102 | 一维离散沃尔什逆变换定义为 103 | 104 | $$ 105 | f(x)=\sum_{u=0}^{N-1} W(u) W a l s h(u, x)\tag{2-71} 106 | $$ 107 | 108 | 式中, $\operatorname{Walsh}(u, x)$ 为沃尔什函数。若将 $W a l s h(u, x)$ 用哈达玛矩阵表示, 并将变换表达式写成矩阵形式, 则式(2-70)和式(2-71) 分别为 109 | 110 | $$ 111 | \left[\begin{array}{c} 112 | W(0) \\ 113 | W(1) \\ 114 | \vdots \\ 115 | W(N-1) 116 | \end{array}\right]=\frac{1}{N}\left[H_{N}\right]\left[\begin{array}{c} 117 | f(0) \\ 118 | f(1) \\ 119 | \vdots \\ 120 | f(N-1) 121 | \end{array}\right]\tag{2-72} 122 | $$ 123 | 124 | 和 125 | 126 | $$ 127 | \left[\begin{array}{c} 128 | f(0) \\ 129 | f(1) \\ 130 | \vdots \\ 131 | f(N-1) 132 | \end{array}\right]=\left[H_{N}\right]\left[\begin{array}{c} 133 | W(0) \\ 134 | W(1) \\ 135 | \vdots \\ 136 | W(N-1) 137 | \end{array}\right]\tag{2-73} 138 | $$ 139 | 140 | 式中, $\left[H_{N}\right]$ 为 $N$ 阶哈达玛矩阵。 由哈达玛矩阵的特点可知, 沃尔什-哈达玛变换的本质上是 141 | 142 | 由哈达玛矩阵的特点可知,沃尔什-哈达玛变换的本质上是将离散序列 $f(x)$ 的各项值的符号按一定规律改变后, 进行加减运算, 因此, 它比采用复数运算的DFT和采用余弦运算的DCT要简单得多。 143 | 144 | 145 | 146 | ## 2.5.2 二维离散沃尔什变换 147 | 148 | 很容易将一维WHT的定义推广到二维WHT。二维WHT的正变换核和逆变换核分别为 149 | 150 | $$ 151 | W(u, v)=\frac{1}{M N} \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} f(x, y) W a l s h(u, x) W slsh(v, y)\tag{2-74} 152 | $$ 153 | 154 | 和 155 | 156 | $$ 157 | f(x, y)=\sum_{u=0}^{M-1} \sum_{v=0}^{N-1} W(u, v) W a l s h(u, x) W s 158 | lsh(v, y)\tag{2-75} 159 | $$ 160 | 161 | 式中: $x, u=0,1,2, \ldots, M-1 ; y, v=0,1,2, \ldots, N-1$ 。 162 | 163 | --- 164 | 165 | 二维离散沃尔什变换的矩阵形式表达式为 166 | $$ 167 | f_{1}=\left[\begin{array}{llll}1 & 3 & 3 & 1 \\ 1 & 3 & 3 & 1 \\ 1 & 3 & 3 & 1 \\ 1 & 3 & 3 & 1\end{array}\right] 168 | $$ 169 | 和 170 | $$ 171 | f_{1}=\left[\begin{array}{llll}1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1\end{array}\right] 172 | $$ 173 | 174 | 求这两个信号的二维WHT。 175 | 176 | 根据题意, 式 (2-76) 中的 $M=N=4$, 其二维WHT变换核为 177 | $$ 178 | H_{4}=\left[\begin{array}{rrrr} 179 | 1 & 1 & 1 & 1 \\ 180 | 1 & -1 & 1 & -1 \\ 181 | 1 & 1 & -1 & -1 \\ 182 | 1 & -1 & -1 & 1 183 | \end{array}\right] 184 | $$ 185 | 186 | 所以 187 | 188 | $$ 189 | \begin{aligned} 190 | W_{1} & =\frac{1}{4^{2}}\left[\begin{array}{rrrr} 191 | 1 & 1 & 1 & 1 \\ 192 | 1 & -1 & 1 & -1 \\ 193 | 1 & 1 & -1 & -1 \\ 194 | 1 & -1 & -1 & 1 195 | \end{array}\right]\left[\begin{array}{rrrr} 196 | 1 & 3 & 3 & 1 \\ 197 | 1 & 3 & 3 & 1 \\ 198 | 1 & 3 & 3 & 1 \\ 199 | 1 & 3 & 3 & 1 200 | \end{array}\right]\left[\begin{array}{rrrr} 201 | 1 & 1 & 1 & 1 \\ 202 | 1 & -1 & 1 & -1 \\ 203 | 1 & 1 & -1 & -1 \\ 204 | 1 & -1 & -1 & 1 205 | \end{array}\right] 206 | =\left[\begin{array}{rrrr} 207 | 2 & 0 & 0 & -1 \\ 208 | 0 & 0 & 0 & 0 \\ 209 | 0 & 0 & 0 & 0 \\ 210 | 0 & 0 & 0 & 0 211 | \end{array}\right] 212 | \end{aligned} 213 | $$ 214 | 215 | 216 | 217 | $$ 218 | W_{2}=\frac{1}{4^{2}}\left[\begin{array}{rrrr} 219 | 1 & 1 & 1 & 1 \\ 220 | 1 & -1 & 1 & -1 \\ 221 | 1 & 1 & -1 & -1 \\ 222 | 1 & -1 & -1 & 1 223 | \end{array}\right]\left[\begin{array}{rrrr} 224 | 1 & 1 & 1 & 1 \\ 225 | 1 & 1 & 1 & 1 \\ 226 | 1 & 1 & 1 & 1 \\ 227 | 1 & 1 & 1 & 1 228 | \end{array}\right]\left[\begin{array}{rrrr} 229 | 1 & 1 & 1 & 1 \\ 230 | 1 & -1 & 1 & -1 \\ 231 | 1 & 1 & -1 & -1 \\ 232 | 1 & -1 & -1 & 1 233 | \end{array}\right] 234 | 235 | =\left[\begin{array}{rrrr} 236 | 1 & 0 & 0 & 0 \\ 237 | 0 & 0 & 0 & 0 \\ 238 | 0 & 0 & 0 & 0 \\ 239 | 0 & 0 & 0 & 0 240 | \end{array}\right] 241 | $$ 242 | 243 | --- 244 | 245 | 再如, 图2-12是一幅数字图像及对其进行二维WHT变换的结果。 246 | 247 | image-20230427151702091 248 | 249 | 图2-12二维WHT结果 250 | (a)原图像;(b) WHT结果 251 | 252 | 注: 图2-12中的结果是按哈达玛变换后再用沃尔什排序的结果。 253 | 254 | 从以上例子可看出, 二维WHT具有能量集中的特性, 而且原始数据中数字越是均匀分布, 经变换后的数据越集中于矩阵的边角上。因此,二维WHT可用于压缩图像信息。 255 | 256 | ## 2.5.3 快速沃尔什变换(FWHT) 257 | 258 | 类似于FFT, WHT也有快速算法FWHT, 也可将输入序列 $f(x)$ 按奇偶进行分组, 分别进行WHT。FWHT的基本关系为 259 | 260 | $$ 261 | \left\{\begin{array}{l} 262 | W(u)=\dfrac{1}{2}\left[W_{e}(u)+W_{o}(u)\right] \\ 263 | W\left(u+\frac{N}{2}\right)=\dfrac{1}{2}\left[W_{e}(u)-W_{o}(u)\right] 264 | \end{array}\right.\tag{2-78} 265 | $$ 266 | 267 | WHT的变换核是可分离和对称的, 因此二维WHT也可分为两个一维的WHT分别用FWHT进行变换而得到最终结果, 由此便可实现二维的FWHT。 268 | 269 | 综上所述, WHT是将一个函数变换成取值为 +1 或 -1 的基本函数构成的级数, 用它来逼近数字脉冲信号时要比FFT有利。 270 | 271 | 同时, WHT只需要进行实数运算, 存储量比FFT要少得多,运算速度也快得多。因此, WHT在图像传输、通信技术和数据压缩中被广泛使用。 -------------------------------------------------------------------------------- /digital-image-processing/IV/4.9 编程实例.md: -------------------------------------------------------------------------------- 1 | # 4.9 编程实例 2 | 3 | ## 4.7.1 编程绘制灰度直方图 4 | 5 | ### 1. 创建灰度直方图数据 6 | 7 | ```c++ 8 | //******************************************* 9 | //函数名称: CreateHistogram() 10 | //参数说明: nX1、 nY1、 nX2、 nY2为需创建直方图图像区域坐标, 默认为- // 1。pData、pPalette、 nWidthBytes为位图数据指针、调色板指 11 | // 针、 图像行字节宽度 12 | //返回值: int型数组指针*pBuffer。在数组中依次存储亮度、红、绿、蓝分量 13 | // 的直方图数据, 每个分量各占256个元素[FK)] 14 | //基本功能:创建指定的图像对象的直方图数据。如果未给定坐标,则针对整 个图像 15 | //**************************************** 16 | int *CPointPro:: CreateHistogram(int nX1, int nY1, int nX2, int nY2, 17 | unsigned char *pData, RGBQUAD *pPalette, int nWidthBytes) 18 | { 19 | //图像指针为空, 无法操作返回 20 | if(m_pDibObject == NULL) return(FALSE); 21 | //分配直方图数据缓存区(数组) 22 | int *pBuffer = new int [256 * 4]; 23 | //分配直方图数据缓存区失败 24 | if(pBuffer == NULL) return( NULL ); 25 | //直方图数据缓存区清零 26 | memset(pBuffer, 0, (256 * 4) * sizeof(int)); 27 | //变量定义 28 | DWORD dwGray; 29 | int x, y; 30 | unsigned char *pTemp, ucRed, ucGreen, ucBlue; 31 | //图像的高度 32 | int nHeight = m_pDibObject->GetHeight(); 33 | switch(m_pDibObject->GetNumBits()) 34 | { 35 | case 24: 36 | for(y = nY1; y < nY2; y++) 37 | { 38 | //数据指针定位到图像数据起始位置 39 | pTemp = pData; 40 | //数据指针定位到图像数据每行的起始零位置 41 | pTemp += (( nHeight - 1 - y) * nWidthBytes); 42 | //数据指针定位到图像数据每行的起始nX1位置 43 | pTemp += (nX1 * 3); 44 | for(x=nX1; x<=nX2; x++) 45 | { 46 | //获取像素颜色的三原色 47 | ucRed = pTemp[x * 3 + 2]; 48 | ucGreen = pTemp[x * 3 + 1]; 49 | ucBlue = pTemp[x * 3]; 50 | //按关系L=0.3R+0.59G+0.11B, 得到亮度值 51 | dwGray = (DWORD) (ucRed * 30 + ucGreen * 59 + ucBlue * 11) / 100; 52 | dwGray &= 0x000000ff; 53 | //亮度直方图数据 54 | pBuffer[dwGray]++; 55 | //红色直方图数据 56 | pBuffer[256 + ucRed]++; 57 | //绿色直方图数据 58 | pBuffer[512 + ucGreen]++; 59 | //蓝色直方图数据 60 | pBuffer[768 + ucBlue]++; 61 | //数据指针加3 62 | pTemp += 3; 63 | } 64 | } 65 | break; 66 | } 67 | return( pBuffer ); 68 | } 69 | ``` 70 | 71 | ### 2.定制灰度直方图对话框 72 | 73 | 定制一个直方图对话框并创建一个CDlgIntensity类, 在它的构造函数中初始化成员变量(例如, 初始化直方图数据指针m_pnHistogram = NULL), 添加WM_PAINT的消息映射函数OnPaint(), 然后在消息映射函数中绘制直方图数据。 74 | 75 | ### 3. 显示直方图 76 | 77 | ```c++ 78 | void CDipView:: OnViewHist() 79 | { 80 | CDipDoc* pDoc = GetDocument(); 81 | ASSERT_VALID(pDoc); 82 | //判断当前是否有图像对象 83 | if( pDoc->m_pDibObject = = NULL ) return; 84 | //在点处理CPointPro类中创建用来绘制直方图的数据 85 | CPointPro PointOperation( pDoc->m_pDibObject ); 86 | int *pHistogram = PointOperation.GetHistogram(); 87 | //生成一个对话框CDlgIntensity类的实例 88 | CDlgIntensity HistDlg; 89 | //将直方图数据传给CDlgIntensity的成员变量m_pnHistogram 90 | if( pHistogram != NULL ) 91 | { 92 | //设置直方图数据指针 93 | HistDlg.m_pnHistogram = pHistogram; 94 | //设置当前像素值为0的像素数 95 | HistDlg.m_nCurrentPiexsNum = pHistogram[0]; 96 | //设置是否为256级灰度图像 97 | HistDlg.m_bIsGray256 = PointOperation.IsGray256(); 98 | } 99 | //显示对话框 100 | if ( HistDlg.DoModal() != IDOK) return; 101 | delete [] pHistogram; 102 | } 103 | 104 | ``` 105 | 106 | ## 4.7.2 中值滤波的VC++编程实现 107 | 108 | 下面以3×3矩形窗口为例来说明8位灰度图像的中值滤波的主要算法。 109 | 110 | ```c++ 111 | for(y = nY1; y < nY2; y++) 112 | { 113 | // pOldBits和pNewBits分别为指向源图像和新图像的图像数据指针 114 | pOldTemp = pOldBits; 115 | pOldTemp += ((nHeight-1-y-1)*nWidthBytes); 116 | pOldTemp += nX1-1; 117 | pNewTemp = pNewBits; 118 | pNewTemp += ((nHeight-1-y-1)*nWidthBytes); 119 | pNewTemp += nX1; 120 | k = 0; 121 | for(x = nX1; xj; k- -) 158 | { 159 | dwMedianList[k] = dwMedianList[k-1 160 | nLoc[k] = nLoc[k-1]; 161 | } 162 | dwMedianList[j] = dwTmp; 163 | nLoc[j]= nTmp; 164 | break; 165 | } 166 | } 167 | } 168 | // 取得3×3邻域排序结果的中间值在原图像中的索引, 并给新图赋值 169 | Data = pOldTemp[nLoc[4]]; 170 | *pNewTemp++ = (unsigned char) m_pDibObject->GetNearestIndex 171 | (pNewPalette[Data].rgbRed, pNewPalette[Data].rgbGreen, 172 | pNewPalette[Data].rgbBlue, pNewPalette, nNumColors ); 173 | k++; 174 | } 175 | } 176 | 177 | ``` 178 | 179 | ## 4.7.3 图像平滑的VC++编程实现 180 | 181 | 1. 设计模板对话框 182 | 图像平滑实际上可以看作是卷积运算, 因此图像平滑的关键在于模板窗口的设计。本例首先定制了如图4-39所示的对话框, 并创建了与之对应的CDlgSmooth类。除了可以使用平均模板和高斯模板外, 还可自定义模板, 模板的大小被限制在5×5内。 183 | 184 | image-20230425194920303 185 | 186 | 图4-39 图像平滑模板设置对话框 187 | 188 | 利用类向导为对话框的相应控件添加成员变量,如模板类型、模板高度、模板宽度、模板中心元素X坐标、模板中心元素Y坐标对应的成员变量分别定义为整型变量m_intType、m_iTempH、m_iTempW、m_iTempMX、m_iTempMY, 而模板系数对应浮点型的变量m_fTempC,另外还定义了一个模板元素数组指针m_fpArray。 189 | 为3个单选按钮分别定义一个单击事件的消息映射,在映射函数中给模板元素m_fpArray及其他成员变量赋值。 190 | 191 | 2. 获取图像数据 192 | 对每个像素的邻域用选定的模板作卷积运算, 就可以得到平滑后的图像。下面给出了卷积运算的源代码。 193 | 卷积函数中的各参数的含义如下: fpData为被卷积的数组, fpKernel为卷积核数组,fCoef为卷积系数,nSize为卷积尺寸, nResult为卷积结果。 194 | 195 | ```c++ 196 | void CAreaPro:: Convolution(float *fpData, float *fpKernel, float fCoef, 197 | int nSize, unsigned char *nResult) 198 | { 199 | int i; 200 | float Sum = 0, fResult; 201 | //计算卷积 202 | for(i = 0; i < nSize; i++) 203 | { 204 | Sum += fpData[i] * fpKernel[i]; 205 | } 206 | //执行卷积后的结果 207 | fResult = Sum / fCoef; 208 | //求绝对值 209 | fResult = (float)fabs(fResult); 210 | //判断是否超过255 211 | if(fResult > 255.0 ) 212 | { 213 | // 直接赋值为255 214 | fResult = 255.0; 215 | } 216 | //对卷积结果四舍五入, 并转换成unsigned char类型作为最后返回结果 217 | *nResult = (unsigned char) (fResult + 0.5); 218 | } 219 | 220 | ``` 221 | 222 | ​ 接着就是对原图像的每个像素作卷积运算,运算后的结果赋予新图像,其中图像边界像素不作处理,代码实现在CAreaPro:: Smoothing()中。 -------------------------------------------------------------------------------- /digital-image-processing/IV/4.8 常见滤波器.md: -------------------------------------------------------------------------------- 1 | # 4.8常见滤波器 2 | 3 | ## 4.8.1频域低通滤波 4 | 5 | ### ILPF 6 | 7 | $$ 8 | \begin{aligned} 9 | & H(u, v)=\left\{\begin{array}{l} 10 | 1, \text { ifD }(u, v) \leq D_0 \\ 11 | 0, \text { ifD }(u, v)>D_0 12 | \end{array}\right. \\ 13 | & D(u, v)=\sqrt{u^2+v^2} 14 | \end{aligned} 15 | $$ 16 | 17 | image-20230425193206897 18 | 19 | 图4-39理想低通滤波器(a)变换函数透视图;(b)图像方式显示的滤波器(c)滤波器的剖面图 20 | 21 | 截止频率与所保留能量的关系 22 | $$ 23 | E_T=\sum_{u=0}^{N-1} \sum_{v=0}^{N-1} E(u, v) \\ 24 | E(u, v)=R^2(u, v)+I^2(u, v) \\ 25 | \beta=100\left[\sum_u \sum_v E(u, v) / E_T\right] \\ 26 | $$ 27 | image-20230425193301672 28 | 29 | 30 | 31 | 图4-40低通滤波器的能量与$D_0$的关系(a)尺寸为$500\times500$像素的图像(b)图像的Fourier谱。叠加的圆环分别具有5、15、30、80、230像素的半径,分别包含的能量为90.0%、94.6%、96.4%、98.0%、99.55% 32 | 33 | IHPF的图像处理效果 34 | 35 | ![image-20230425193359163](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230425193359163.png) 36 | 37 | 图4-41 图像4-39(a)经过理想低通滤波器的结果, 38 | 对应的半径分别为15、30、80,滤去的能量为5.4%、3.6%、2%。 39 | 40 | ### 振铃效应 41 | 42 | $$ 43 | G(u,v)=H(u,v)F(u,v)\\ 44 | g(x,y)=h(x,y)*f(x,y) 45 | $$ 46 | 47 | 48 | 49 | image-20230425193518474 50 | 51 | 图4-42(a)半径为5的脉冲图像 (b)相应的空间滤波器 52 | 53 | (c)空域的5个脉冲(d)滤波结果 54 | 55 | 滤波器1 56 | 57 | image-20230425193601972 58 | 59 | 滤波器2 60 | 61 | image-20230425193616333 62 | 63 | ### 巴特沃思滤波器Butterworth 64 | 65 | BLPF: 66 | $$ 67 | H(u, v)=\frac{1}{1+\left[D(u, v) / D_0\right]^{2 n}} 68 | $$ 69 | ![image-20230425193703918](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230425193703918.png) 70 | 71 | 图4-43 BLPF特性曲线 72 | 73 | BLPF的滤波结果 74 | 75 | image-20230425193721411 76 | 77 | 图4-44 二阶BLPF滤波的结果(a)原图像, 78 | (b)半径15,(b)半径30,(d)半径80 79 | 80 | ### 指数滤波器或高斯滤波器 81 | 82 | ELPF: 83 | $$ 84 | H(u, v)=e^{-\left[D(u, v) / D_0\right]^n} 85 | $$ 86 | image-20230425193751790 87 | 88 | 图4-45高斯滤波器(a)传递函数的透视图;(b)图像形式;(c)径向剖面图 89 | 90 | ELPF的滤波效果 91 | 92 | image-20230425193807471 93 | 94 | 图4-46 高斯滤波器的处理效果, 95 | 从左到右依次为原图、半径15、30、80 96 | 97 | ## 4.8.2高通滤波器 98 | 99 | image-20230425193827184 100 | 101 | 图4-47 三种典型的高通滤波器,从上到下依次为理想高通滤波器、巴特沃思高通滤波器、指数滤波器。 102 | 103 | ### 高通滤波器定义 104 | 105 | IHPF: 106 | $$ 107 | H(u, v)=\left\{\begin{array}{l} 108 | 0, \text { if } D(u, v) \leq D_{0 ;} \\ 109 | 1, \text { if } D(u, v)>D_0 . 110 | \end{array} \quad D(u, v)=\sqrt{u^2+v^2}\right.\\ 111 | $$ 112 | BHPF: 113 | $$ 114 | H(u, v)=\frac{1}{1+\left[D_0 / D(u, v)\right]^{2 n}} 115 | $$ 116 | EHPF: 117 | $$ 118 | H(u, v)=e^{-\left[D_0 / D(u, v)\right]^{n}} 119 | $$ 120 | THPF: 121 | $$ 122 | H(u, v)=\left\{\begin{array}{lr} 123 | 0 & D(u, v)D_1 126 | \end{array}\right. 127 | $$ 128 | HPF比较 129 | 130 | image-20230425194000220 131 | 132 | 高通滤波器效果 133 | 134 | image-20230425194028009 135 | 136 | 图4-48 理想高通滤波效果,从左到右依次为$D_0$=15,30,80。越小,振铃效应越明显 137 | 138 | image-20230425194049850 139 | 140 | 图4-49 BHPF效果,从左到右依次为$D_0$=15,30,80。比IHPF的结果平滑得多 141 | 142 | image-20230425194146423 143 | 144 | 图5-50高斯高通滤波效果,从左到右依次为$D_0$=15,30,80。 145 | 146 | ### 高频加强 147 | 148 | $$ 149 | \begin{aligned} 150 | & H^{\prime}(u, v)=H(u, v)+c, 0 156 | 157 | 图4-51 X光片原图;高通滤波效果;高频增强效果;直方图均衡化效果 158 | 159 | ## 4.8.3带通(带阻)滤波器 160 | 161 | 抑制以点 $(u 0, v 0)$ 为中心, $D 0$ 为半径的邻域中所有频率的理想带阻滤波器 (IBPF) 的转移函数为: 162 | $$ 163 | H(u, v)=\left\{\begin{array}{lll} 164 | 0, & \text { if } & D(u, v) \leq D_0 \\ 165 | 1, & \text { if } & D(u, v)>D_0 166 | \end{array}\right.\\ 167 | D(u, v)=\left\{\left(u-u_0\right)^2+\left(v-v_0\right)^2\right\}^{1 / 2} 168 | $$ 169 | image-20230425194334938 170 | 171 | ### 不围绕原点的情况 172 | 173 | $$ 174 | H(u,v)=\begin{cases} 175 | 0 &&if\,\,D_1(u,v)\leq D_0 \,\,or\,\, D_2(u,v)\leq D_0\\ 176 | 1&& else 177 | \end{cases} 178 | $$ 179 | 180 | 181 | $$ 182 | \begin{aligned} 183 | &\begin{aligned} 184 | & D_1(u, v)=\left\{\left(u-u_0\right)^2+\left(v-v_0\right)^2\right\}^{1 / 2} \\ 185 | & 186 | \end{aligned}\\ 187 | &D_2(u, v)=\left\{\left(u+u_0\right)^2+\left(v+v_0\right)^2\right\}^{1 / 2} 188 | \end{aligned} 189 | $$ 190 | 191 | ### 围绕原点的模型 192 | 193 | 为消去围绕原点的一个频带,必须考虑周期性和对称性。一个径向对称(放射对称)的理想带阻滤波器 194 | $$ 195 | H(u, v)=\left\{\begin{array}{rr} 196 | 1, & \text { if } D(u, v)D_0+\frac{W}{2} 199 | \end{array}\right. 200 | $$ 201 | ![image-20230425194440894](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230425194440894.png) 202 | 203 | ### 巴特沃思带阻滤波器用于去噪声 204 | 205 | image-20230425194459895 206 | 207 | (a)被正弦噪声污染的图像 (b)图像(a)的频谱 (c)巴特沃思带阻滤波器 (d)图像(a)的滤波效果 208 | 209 | ## 频域滤波小结 210 | 211 | 物理可实现的低通滤波器的传递函数必须是连续的。如果处处可导,滤波后的图像就不会出现振铃效应; 212 | 213 | 频域低通滤波器的效果是去除图像中的高频噪声,去噪声的能力与滤波器的形式以及截止频率有关; 214 | 215 | 频域低通滤波器在滤除噪声的同时会造成图像模糊,图像模糊的程度与截止频率有关; 216 | 217 | 高通滤波器可以增强图像的边缘,是实现图像边缘检测的基础; 218 | 219 | 高通滤波器基本上抑制了图像中的平滑信息,因此如要在保持图像基本信息的基础上实现锐化,就需要采用高频加强技术; 220 | 221 | 带通和带阻滤波器在消除特定类型的噪声上有很好的效果,它们也是彩色图像增强的技术基础; 222 | 223 | 同态滤波是一类利用图像的照明反射模型,同时实现亮度动态范围压缩和图像对比度增强的技术 -------------------------------------------------------------------------------- /digital-image-processing/III/3.1 图像编码概述.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 3.1 图像编码概述 4 | 5 | ## 3.1.1 图像编码基本原理 6 | 7 | 虽然表示图像需要大量的数据, 但图像数据是高度相关的, 或者说存在冗余 (Redundancy) 信息, 去掉这些冗余信息后可以有效压缩图像, 同时又不会损害图像的有效信息。数字图像的写余主要表现为以下几种形式: 空间几余、时间冗余、视觉杂、 信息熵咒余、结构冗余和知识冗余。 8 | 9 | - 空间冗余:图像内部相邻像素之间存在较强的相关性所造成的咒余。 10 | 11 | - 时间写余: 视频图像序列中的不同帧之间的相关性所造成的写余。 12 | 13 | - 视觉冗余: 是指人眼不能感知或不敏感的那部分图像信息。 14 | 15 | - 信息熵冗余: 也称编码冗余,如果图像中平均每个像素使用的比特数大于该图像的信息熵, 则图像中存在咒余, 这种冗余称为信息熵冗余。 16 | 17 | - 结构冗余:是指图像中存在很强的纹理结构或自相似性。 18 | 19 | - 知识冗余: 是指在有些图像中还包含与某些先验知识有关的信息。 20 | 21 | 图像数据的这些冗余信息为图像压缩编码提供了依据。如, 利用人眼对蓝光不敏感的视觉特性, 在对彩色图像编码时, 就可以用较低的精度对蓝色分量进行编码。图像编码的目的就是充分利用图像中存在的各种呪余信息, 特别是空间几余、时间冗余以及视觉冗余, 以尽量少的比特数来表示图像。利用各种冗余信息, 压缩编码技术能够很好地解决在将模拟信号转换为数字信号后所产生的带宽需求增加的问题, 它是使数字信号走上实用化的关键技术之一, 表3-1中列出了几种常见应用的码率。 22 | $$ 23 | \begin{array}{|c|c|c|c|c|c|c|c|} 24 | \hline \text { 应用场合 } & \text { 比特/像素 } & \text { 像索数/行 } & \text { 行数/帧 } & \text { 帧数/秒 } & \text { 亮色比 } & \text { 比特/秒(压缩前) } & \text { 比特/秒(压缩后) } \\ 25 | \hline \text { 高清晰电视 } & 8 & 1920 & 1080 & 30 & 4: 1: 1 & 1.18 ~Gb / s & 20 \sim 25 Mb / s \\ 26 | \hline \text { 普通电视 } & 8 & 720 & 480 & 30 & 4: 1: 1 & 167 Mb / s & 4 \sim 8 Mb / s \\ 27 | \hline \text { 会议电视 } & 8 & 352 & 288 & 30 & 4: 1: 1 & 36.5 Mb / s & 1.5 \sim 2 Mb / s \\ 28 | \hline \text { 桌上电视 } & 8 & 176 & 144 & 30 & 4: 1: 1 & 9.1 Mb / s & 128 ~Kb / s \\ 29 | \hline \text { 电视电话 } & 8 & 128 & 112 & 30 & 4: 1: 1 & 5.2 Mb / s & 56 ~Kb / s \\ 30 | \hline 31 | \end{array} 32 | $$ 33 | 表3-1 几种常见应用的码率 34 | 35 | ## 3.1.2 图像编码的方法 36 | 37 | 根据编码过程中是否存在信息损耗可将图像编码分为有损压缩和无损压缩。 38 | 39 | - 无损压缩: 无信息损失, 解压缩时能够从压缩数据精确地恢复原始图像; 40 | 41 | - 有损压缩:不能精确重建原始图像, 存在一定程度的失真。 42 | 43 | 图像冗余有损压缩的原理 44 | $$ 45 | \begin{array}{|l|l|l|l|l|} 46 | \hline 36 & 35 & 34 & 34 & 34 \\ 47 | \hline 34 & 34 & 32 & 34 & 34 \\ 48 | \hline 33 & 37 & 30 & 34 & 34 \\ 49 | \hline 34 & 34 & 34 & 34 & 34 \\ 50 | \hline 34 & 35 & 34 & 34 & 31 \\ 51 | \hline 52 | \end{array} 53 | \Rightarrow 54 | \begin{array}{|l|l|l|l|l|} 55 | \hline 34 & 34 & 34 & 34 & 34 \\ 56 | \hline 34 & 34 & 34 & 34 & 34 \\ 57 | \hline 34 & 34 & 34 & 34 & 34 \\ 58 | \hline 34 & 34 & 34 & 34 & 34 \\ 59 | \hline 34 & 34 & 34 & 34 & 34 \\ 60 | \hline 61 | \end{array} 62 | \Rightarrow 63 | \begin{array}{|l|l|} 64 | \hline 25 &34\\ 65 | \hline 66 | \end{array} 67 | $$ 68 | 图像冗余无损压缩的原理 69 | $$ 70 | \begin{array}{|l|l|l|l|} 71 | \hline\quad & \quad&\quad &\quad\\ 72 | \hline & & &\\ 73 | \hline & & &\\ 74 | \hline & & &\\ 75 | \hline 76 | \end{array} 77 | \Rightarrow 78 | \begin{array}{|l|l|l|l|} 79 | \hline \text { RGB } & \text { RGB } & \text { RGB } & \text { RGB } \\ 80 | \hline \text { RGB } & \text { RGB } & \text { RGB } & \text { RGB } \\ 81 | \hline \text { RGB } & \text { RGB } & \text { RGB } & \text { RGB } \\ 82 | \hline \text { RGB } & \text { RGB } & \text { RGB } & \text { RGB } \\ 83 | \hline 84 | \end{array} 85 | \Rightarrow 86 | \begin{array}{|c|c|} 87 | \hline 16 & RGB \\ 88 | \hline 89 | \end{array} 90 | $$ 91 | 92 | 93 | - 第一代压缩编码 94 | 95 | 八十年代以前, 主要是根据传统的信源编码方法。 96 | 97 | image-20230423141843511 98 | 99 | - 第二代压缩编码 100 | 101 | 八十年代以后, 突破信源编码理论, 结合分形、 模型基、神经网络、小波变换等数学工具, 充分利用视觉系统生理心理特性和图像信源的各种特性。 102 | 103 | image-20230423141910572 104 | 105 | 根据编码原理可以将图像编码分为熵编码、预测编码、变换编码和混合编码等。 106 | 107 | 图像压缩编码系统原理框图 108 | 109 | ![image-20230423141939605](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230423141939605.png) 110 | 111 | (1) 熵编码。熵编码是纯粹基于信号统计特性的编码技术, 是一种无损编码。熵编码的基本原理是给出现概率较大的符号赋予一个短码字, 而给出现概率较小的符号赋予一个长码字, 从而使得最终的平均码长很小。 常见的熵编码方法有行程编码 (Run Length Encoding)、哈夫曼编码和算术编码。 112 | 113 | (2)预测编码。预测编码是基于图像数据的空间或时间冗余特性, 用相邻的已知像素(或像素块)来预测当前像素(或像素块)的取值, 然后再对预测误差进行量化和编码。预测编码可分为帧内预测和帧间预测, 常用的预测编码有差分脉码调制(Differential Pulse Code Modulation,DPCM)和运动补偿法。 114 | 115 | (3)变换编码。变换编码通常是将空间域上的图像经过正交变换映射到另一变换域上, 使变换后的系数之间的相关性降低。 图像变换本身并不能压缩数据, 但变换后图像的大部分能量只集中到少数几个变换系数上, 采用适当的量化和熵编码就可以有效地压缩图像。 116 | 117 | (4) 混合编码。混合编码是指综合了熵编码、变换编码或预测编码的编码方法, 如JPEG标准和MPEG标准。 118 | 119 | 根据对压缩编码后的图像进行重建的准确程度, 可将常用的图像编码方法分为三类: 120 | 121 | (1)信息保持编码: 也称无失真编码, 它要求在编解码过程中保证图像信息不丢失, 从而可以完整地重建图像。信息保持编码的压缩比较低, 一般不超过3: 1, 主要应用在图像的数字存储方面, 常用于医学图像编码中。 122 | 123 | (2)保真度编码: 主要利用人眼的视觉特性, 在允许的失真 (Lossy) 条件下或一定的保真度准则下, 最大限度地压缩图像。保真度编码可以实现较大的压缩比, 主要用于数字电视技术、静止图像通信、娱乐等方面。对于这些图像,过高的空间分辨率和过多的灰度层次, 不仅增加了数据量, 而且人眼也接收不到。因此在编码过程中, 可以丢掉一些人眼不敏感的信息, 在保证一定的视觉效果条件下提高压缩比。 124 | 125 | (3) 特征提取: 在图像识别、分析和分类等技术中, 往往并不需要全部图像信息, 而只要对感兴趣的部分特征信息进行编码即可压缩数据。例如, 对遥感图像进行农作物分类时,就只需对用于区别农作物与非农作物, 以及农作物类别之间的特征进行编码, 而可以忽略道路、河流、建筑物等其他背景信息。 126 | 127 | ## 3.1.3 图像编码新技术 128 | 129 | 图像编码已经发展了几十年, 人们不断提出新的压缩方法。如, 利用人工神经网络 (Artificial Neural Network, ANN) 的压缩编码、分形编码(Fractal Coding)、小波编码(Wavelet Coding)、基于对象的压缩编码(Object Based Coding)和基于模型的压缩编码(Model Based Coding)等等。 130 | 131 | 1)分形编码 132 | 133 | 分形编码是在波兰美籍数学家B.B.Mandelbrot建立的分形几何理论的基础上发展起来的一种编码方法。分形编码最大限度地利用了图像在空间域上的自相似性(即局部与整体之间存在某种相似性),通过消除图像的几何几穴余来压缩数据。 M.Barnsley将迭代函数系统 (Iterate Function System,IFS) 用于描述图像的自相似性, 并将其用于图像编码, 对某些特定图像获得了10 000: 1的压缩比。分形编码过程十分复杂, 而解码过程却很简单, 故通常用于对图像编码一次, 而需译码多次的信息传播应用中。 134 | 135 | 2)小波编码 136 | 137 | 1989年, S.G.Mallat首次将小波变换用于图像编码。经过小波变换后的图像, 具有良好的空间方向选择性, 而且是多分辨率的, 能够保持原图像在各种分辨率下的精细结构, 与人的视觉特性十分吻合。 138 | 139 | 3)模型编码 140 | 141 | 模型编码是近几年发展起来的一种很有前途的低比特率编码方法, 其基本出发点是在编、解码两端分别建立起相同的模型,编码时利用先验模型抽取图像中的主要信息并用模型参数的形式表示,解码时则利用所接收的模型参数重建图像。 142 | 143 | ## 4.1.4 图像编码评价 144 | 145 | 随着众多图像压缩算法的出现, 如何评价图像压缩算法就成为重要的课题。一般说来, 评价图像压缩算法的优劣主要有以下4个参数。 146 | 147 | 1)算法的编码效率 148 | 149 | 算法的编码效率通常有几种表现形式: 平均码字长度(R), 图像的压缩比 (rate, $r$ ), 每秒钟所需的传输比特数 (bits per second, bps), 图像熵与平均码长之比 $(\eta)$, 这些表现形式很容易相互转换。下面给出与图像编码效率有关的几个定义。 设一幅灰度级为 $N$ 的图像, 图像中第 $k$ 级灰度出现的概率为 $P_{k}$, 150 | 151 | 图像大小为 $N_{x} \times N_{y}$, 每个像素用 $d$ 比特表示, 每两帧图像间隔 $\Delta t$, 则按信息论中信息熵的定义, 数字图像的熵 $H$ 由下式定义: 152 | 153 | $$ 154 | H=-\sum_{k=1}^{N} P_{k} 1 b P_{k}\tag{3-1} 155 | $$ 156 | 157 | 由此可见, 图像熵 $H$ 表示各灰度级比特数的统计平均值。 158 | 159 | 对于一种图像编码方法, 设第 $k$ 级灰度的码字长度为 $B_{k}$, 则该图像的平均码字长度 $R$ 为 160 | 161 | $$ 162 | R=\sum_{k=1}^{N} B_{k} P_{k}\tag{3-2} 163 | $$ 164 | 165 | 于是,可定义编码效率 $\eta$ 为 166 | 167 | $$ 168 | \eta=\frac{H}{R} \times 100 \%\tag{3-3} 169 | $$ 170 | 171 | 每秒钟所需的传输比特数bps为 172 | 173 | $$ 174 | b p s=\frac{N_{x} N_{y} R}{\Delta t}\tag{3-4} 175 | $$ 176 | 177 | 压缩比 $r$ 为 178 | $$ 179 | r=\frac{d}{R}\tag{3-5} 180 | $$ 181 | 由于同一压缩算法对不同图像的编码效率会有所不同, 因此常需定义一些 “标准图像”,如国际上流行的三幅图像Lena、Barbara和Mandrill。一般通过测量不同压缩算法对同一组 “标准图像”的编码性能来评价各图像压缩算法的编码效率。 182 | 183 | 2)编码图像的质量 184 | 185 | 图像质量评价可分为客观质量评价和主观质量评价。最常用 186 | 187 | 的客观质量评价指标是均方误差 (MSE) 和峰值信噪比 188 | 189 | (PSNR),其定义如下: 190 | 191 | $$ 192 | M S E=\frac{1}{N_{x} N_{y}} \sum_{i=0}^{N_{x}} \sum_{j=0}^{N_{y}}[f(i, j)-\hat{f}(i, j)]^{2} \tag{3-6} 193 | $$ 194 | 195 | $$ 196 | P S N R=10 \lg \left(\frac{255 \times 255}{M S E}\right)\tag{3-7} 197 | $$ 198 | 199 | 主观质量评价是指由一批观察者对编码图像进行观察并打分, 然后综合所有人的评判结果, 给出图像的质量评价。客观质量评价能够快速有效地评价编码图像的质量, 但符合客观质量评价指标的图像不一定具有较好的主观质量。主观质量评价能够与人的视觉效果相匹配, 但其评判过程缓慢费时。 200 | 201 | 3)算法的适用范围 202 | 203 | 特定的图像编码算法具有其相应的适用范围, 并不对所有图像都有效。一般说来, 大多数基于图像信息统计特性的压缩算法具有较广的适用范围, 而一些特定的编码算法的适用范围较窄, 如分形编码主要用于自相似性高的图像。 204 | 205 | 4)算法的复杂度 206 | 207 | 算法的复杂度即指完成图像压缩和解压缩所需的运算量和硬件实现该算法的难易程度。优秀的压缩算法要求有较高的压缩比, 压缩和解压缩快, 算法简单, 易于硬件实现, 还要求解压缩后的图像质量较好。选用编码方法时一定要考虑图像信源本身的统计特性、多媒体系统(硬件和软件产品)的适应能力、应用环境以及技术标准。 -------------------------------------------------------------------------------- /digital-image-processing/VI/6.5 图像旋转.md: -------------------------------------------------------------------------------- 1 | # 6.5 图像旋转 2 | 3 | ## 6.5.1 图像旋转变换 4 | 5 | 本节介绍一种相对复杂的几何变换一图像的旋转。一般图像的旋转是以图像的中心为原点, 将图像上的所有像素都旋转 一个相同的角度。图像的旋转变换是图像的位置变换, 但旋转后, 图像的大小一般会改变。和图像平移一样, 在图像旋转变 换中既可以把转出显示区域的图像截去, 也可以扩大图像范围 以显示所有的图像。如图6-20、图6-21所示。 6 | 7 | 8 | 9 | 图6-20 旋转前的图像 10 | ![](https://cdn.mathpix.com/cropped/2023_03_28_09ce99927b2515b3c70fg-27.jpg?height=838&width=2098&top_left_y=432&top_left_x=169) 11 | 12 | 图6-21 旋转 $\theta$ 后的图像(扩大图像、转出部分被截) 13 | 14 | 同样, 图像的旋转变换也可以用矩阵变换表示。设点 $P_{0}\left(x_{0}, y_{0}\right)$旋转 $\theta$ 角后的对应点为 $P(x, y)$, 如图6-22所示。那么, 旋转前后 点 $P_{0}\left(x_{0}, y_{0}\right) 、 P(x, y)$ 的坐标分别是: 15 | 16 | ![](https://cdn.mathpix.com/cropped/2023_03_28_09ce99927b2515b3c70fg-28.jpg?height=944&width=1209&top_left_y=548&top_left_x=607) 17 | 图6-22 图像旋转 $\theta$ 角 18 | $$ 19 | \begin{aligned} 20 | & \left\{\begin{array}{l} 21 | x_0=r \cos \alpha \\ 22 | y_0=r \sin \alpha 23 | \end{array}\right. \\ 24 | & \left\{\begin{array}{l} 25 | x=r \cos (\alpha-\theta)=r \cos \alpha \cos \theta+r \sin \alpha \sin \theta=x_0 \cos \theta+y_0 \sin \theta \\ 26 | y=r \sin (\alpha-\theta)=r \sin \alpha \cos \theta-r \cos \alpha \sin \theta=-x_0 \sin \theta+y_0 \cos \theta 27 | \end{array}\right. 28 | \end{aligned} 29 | $$ 30 | 写成矩阵表达式为 31 | $$ 32 | \left[\begin{array}{l} 33 | x \\ 34 | y \\ 35 | 1 36 | \end{array}\right]=\left[\begin{array}{ccc} 37 | \cos \theta & \sin \theta & 0 \\ 38 | -\sin \theta & \cos \theta & 0 \\ 39 | 0 & 0 & 1 40 | \end{array}\right]\left[\begin{array}{l} 41 | x_0 \\ 42 | y_0 \\ 43 | 1 44 | \end{array}\right]\tag{6-5} 45 | $$ 46 | 其逆运算为 47 | 48 | $$ 49 | \left[\begin{array}{l} 50 | x \\ 51 | y \\ 52 | 1 53 | \end{array}\right]=\left[\begin{array}{ccc} 54 | \cos \theta & -\sin \theta & 0 \\ 55 | \sin \theta & \cos \theta & 0 \\ 56 | 0 & 0 & 1 57 | \end{array}\right]\left[\begin{array}{l} 58 | x_{0} \\ 59 | y_{0} \\ 60 | 1 61 | \end{array}\right] 62 | $$ 63 | 64 | 利用公式 (6-5) 可以确定旋转后图像上的像素。例如, 当 $\theta=30^{\circ}$ 时, 公式 (6-5) 为 65 | 66 | $$ 67 | \left\{\begin{array}{l} 68 | x=0.866 x-0.5 y \\ 69 | y=0.5 x+0.866 70 | \end{array}\right. 71 | $$ 72 | 而且, 此时 73 | 74 | $$ 75 | \begin{aligned} 76 | & x_{\min }=0.866-0.5 \times 3=-0.634 ; x_{\min }=0.866 \times 3-0.5=2.098 \\ 77 | & y_{\min }=0.866+0.5=1.366 ; \quad y_{\max }=0.866 \times 3+0.5 \times 3=4.098 78 | \end{aligned} 79 | $$ 80 | ![](https://cdn.mathpix.com/cropped/2023_03_28_86df48ed620aaa1dabb8g-01.jpg?height=622&width=1950&top_left_y=773&top_left_x=346) 81 | 图6-23 图像旋转 $\theta$ 角 82 | 83 | 利用公式(6-5)进行图像旋转时需要注意如下两点: 84 | 85 | (1) 图像旋转之前, 为了避免信息的丢失, 一定要有坐标平移,具体的做法有如图6-24所示的两种方法。 86 | ![](https://cdn.mathpix.com/cropped/2023_03_28_86df48ed620aaa1dabb8g-02.jpg?height=870&width=1744&top_left_y=674&top_left_x=378) 87 | 88 | 图6-24 图像旋转之前进行的平移 (2) 图像旋转之后, 会出现许多空洞点, 如图6-23所示。对 这些空洞点必须进行填充处理, 否则画面效果不好, 一般也称 这种操作为揷值处理。最简单的方法是行揷值方法或列揷值方 法: 89 | 90 | (1) 找出当前行的最小和最大的非白点的坐标, 记作: $(i, k 1)$ 、 $(i, k 2)$ 。 91 | 92 | (2) 在(k1, k2)范围内进行揷值, 揷值的方法是: 空点的像素 值等于前一点的像素值。 93 | 94 | (3) 同样的操作重复到所有行。经过如上的揷值处理之后, 图像效果就变得自然。如图6-25所示。列揷值方法与此类同, 请读者自己给出。 95 | ![](https://cdn.mathpix.com/cropped/2023_03_28_86df48ed620aaa1dabb8g-04.jpg?height=650&width=1970&top_left_y=539&top_left_x=228) 96 | 97 | 图6-25 图6-23中的图像处理后的效果 98 | 99 | ## 6.5.2 图像旋转的实现 100 | 101 | 按照上述理论,也可以用VC++编程实现图像的旋转。为了 将重点放在算法本身, 下面介绍灰度图像的旋转算法。由上面 的公式(6-6)以及产生空穴时的双线性揷值方法,可以编制一 个实现图像旋转的函数RotateDIB2()。下面给出这个函数的框架和主要算法。 102 | 103 | ```c++ 104 | //***************************************** 105 | //函数名称: BOOL Rotate() 106 | //基本功能: 本函数对传入的CDibObject对象中的图像进行旋转操作 107 | //参数说明: int iRotateAngle 旋转的角度(0~360度) 108 | // BOOL bBilinear TRUE为双线性插值, FALSE为最邻近插值 109 | // CDibObject *pDibObject 默认为NULL 110 | //返回值: BOOL 成功返回TRUE, 失败返回FALSE 111 | //***************************************** 112 | BOOL CGeoTrans:: Rotate(int nRotateAngle, BOOL bBilinear, CDibObject *pDibObject) 113 | { 114 | //获得图像宽度和高度: nOldWidth、 nOldHeight 115 | //定义旋转角度(弧度)及其正弦和余弦值: fRotateAngle、 fSina、 fCosa 116 | //定义源图四个角的坐标、 旋转后四个角的坐标(以图像中心为坐标系原点) 117 | //计算旋转角度的正弦和余弦值 118 | //计算源图的四个角的坐标(以图像中心为坐标系原点) 119 | //计算新图四个角的坐标(以图像中心为坐标系原点) 120 | fDstX1 = fCosa * fSrcX1 + fSina * fSrcY1; 121 | fDstY1 = -fSina * fSrcX1 + fCosa * fSrcY1; 122 | fDstX2 = fCosa * fSrcX2 + fSina * fSrcY2; 123 | fDstY2 = -fSina * fSrcX2 + fCosa * fSrcY2; 124 | fDstX3 = fCosa * fSrcX3 + fSina * fSrcY3; 125 | fDstY3 = -fSina * fSrcX3 + fCosa * fSrcY3; 126 | fDstX4 = fCosa * fSrcX4 + fSina * fSrcY4; 127 | fDstY4 = -fSina * fSrcX4 + fCosa * fSrcY4; 128 | //计算旋转后的图像实际宽度 129 | int nNewWidth=(long)(max(fabs(fDstX4-fDstX1), fabs(fDstX3-fDstX2))+0.5); 130 | //计算旋转后的图像高度 131 | int nNewHeight=(long)(max(fabs(fDstY4-fDstY1), fabs(fDstY3-fDstY2))+0.5); 132 | //计算两个常数 133 | f1= (float) (-0.5 * (nNewWidth - 1) * fCosa - 0.5 * (nNewHeight - 1) * fSina 134 | + 0.5 * (nOldWidth - 1)); 135 | f2= (float) ( 0.5 * (nNewWidth - 1) * fSina - 0.5 * (nNewHeight - 1) * fCosa 136 | + 0.5 * (nOldHeight - 1)); 137 | //获取指向源图像的指针, 为旋转图像分配内存并用白色填充新图像数据区 138 | //由图像位数确定的移动字节数nMovedBits 139 | //针对图像每行进行操作 140 | for(y = 0; y < nNewHeight; y++) 141 | { 142 | //指向新图像第y行 143 | pNewTemp = pNewBits; 144 | pNewTemp += (nNewHeight - 1 - y) * nNewWidthBytes; 145 | //针对图像每列进行操作 146 | for(x = 0; x < nNewWidth; x++) 147 | { 148 | //计算该像素在源图像中的坐标 149 | int y0 = (long) (-((float) x) * fSina + ((float) y) 150 | * fCosa + f2 + 0.5); 151 | int x0 = (long) ( ((float) x) * fCosa + ((float) y) 152 | * fSina + f1 + 0.5); 153 | //判断是否在源图范围内 154 | if( (x0 >= 0) && (x0 < nOldWidth) && (y0 >= 0) && (y0 < nOldHeight)) 155 | { 156 | //用双线性插值 157 | if(bBilinear) 158 | { 159 | unsigned char *pTemp = Interpolation (nOldWidth, nOldHeight, 160 | (float)x0, (float)y0, nOldWidthBytes, nMovedBits, pOldBits); 161 | //复制像素 162 | memcpy(pNewTemp, pTemp, nMovedBits); 163 | delete [] pTemp ; 164 | } 165 | else 166 | { 167 | //指向源图像第y0行, 第x0个像素 168 | pOldTemp = pOldBits; 169 | pOldTemp += (nOldHeight - 1 - y0) * nOldWidthBytes; 170 | pOldTemp += x0 * nMovedBits; 171 | //复制像素 172 | memcpy(pNewTemp, pOldTemp, nMovedBits); 173 | } 174 | } 175 | pNewTemp += nMovedBits; 176 | } 177 | } 178 | //将内存解锁和将不再使用的内存释放, 将新图像设置为当前图像 179 | return TRUE; 180 | } 181 | ``` 182 | 183 | 184 | 185 | 图6-26 旋转前的图像 186 | 187 | 188 | 189 | 190 | 191 | 图6-27 旋转 $15^{\circ}$ 并进行揷值处理的图像 192 | 193 | 194 | 195 | 图6-28 被放大的旋转前图像 196 | 197 | 198 | 199 | 6-29 旋转300并进行揷值处理的放大图像 -------------------------------------------------------------------------------- /digital-signal-processing/4.连续时间信号的抽样.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 连续时间信号的抽样 4 | 5 | ## 抽样的基本概念 6 | 7 | 所谓 “抽样”, 就是利用抽样脉冲序列从连续时间信号中抽取一系列的离散样值, 由此得到的离散时间信号通常称为抽样信号, 以 $\hat{x}_{a}(t)$ 表示. 8 | 9 | 10 | 11 | 如果开关每次闭合的时间为 $\tau$ 秒, 那么 抽样器的轮出将是一串周期为 $T$, 宽度为 $\tau$ 的脉冲 12 | 13 | (编者注:所谓抽样实际上就是利用矩形波脉冲信号和原信号相乘,可以通过模拟乘法器来实现) 14 | 15 | ## 抽样过程 16 | 17 | 18 | 19 | (编者注:注意理**想抽样信号绝不是一串离散的点,而是一连串的冲激函数**,从信息的角度分析,抽样是提取了原信号中的部分信息,传递信息必须具有能量,理想抽样时每次时间为无穷小,故幅值必须为无穷大,如此能量才不为0,平时分析用到的**序列实则是抽样后不同冲激函数的相对值**,是一种逻辑上的抽象) 20 | 21 | 22 | 现提出两个问题: 23 | 24 | 1. 抽样前后信号频谱的变化如何? 25 | 26 | 2. 什么条件下, 可以从抽样信号不失真地恢复原信号? 27 | 28 | ## 理想抽样及其频谱 29 | 30 | (编者注:这一小节十分重要,需要时常复习) 31 | 32 | ### 时域分析 33 | 34 | - 数学模型 35 | 36 | 37 | 38 | - 抽样脉冲(冲激函数序列): 39 | 40 | $$ 41 | p(t)=\delta_{T}(t)=\sum_{n=-\infty}^{\infty} \delta(t-n T) 42 | $$ 43 | 44 | - 理想抽样输出: 45 | 46 | $$ 47 | \hat{x}_{a}(t)=x_{a}(t) \cdot \delta_{T}(t)=\sum_{n=-\infty}^{\infty} x_{a}(n T) \delta(t-n T) 48 | $$ 49 | 50 | ### 频域分析 51 | 52 | $$ 53 | 时域相乘 & \quad \quad \rightarrow \quad \quad& 频域卷积 \\ 54 | \hat{x}_a(t)=x_a(t) & & \hat{X}_{a}(j \Omega)=\frac{1}{2 \pi}\left[X_{a}(j \Omega) * P(j \Omega)\right] 55 | $$ 56 | 57 | #### 冲激函数序列 $\delta_{\mathrm{T}}(\mathrm{t})$ 的频谱 58 | 59 | 考虑到周期信号可以用傅里叶级数展开, 因此, 冲激函数序列 $\delta_{\mathrm{T}}(\mathrm{t})$ 可用傅里叶级数表示为: 60 | $$ 61 | \delta_{T}(t)=\sum_{n=-\infty}^{\infty} A_{n} \cdot e^{j n \Omega_{s} t} 62 | $$ 63 | 其中 $\Omega_{s}=2 \pi / T$ 64 | 利用傅里叶变换的定义得: 65 | $$ 66 | A_{n}=\frac{1}{T} \int_{-T / 2}^{T / 2} \delta(t) e^{-j n \Omega_{1} t} d t=\frac{1}{T} \int_{-T / 2}^{T / 2} \delta(t) d t=\frac{1}{T} 67 | $$ 68 | 69 | 代入原式 70 | $$ 71 | \delta_{T}(t)=\frac{1}{T} \sum_{n--\infty}^{\infty} e^{j n \Omega, t} 72 | $$ 73 | 74 | 上式表明冲激函数序列具有梳状谱的结构, 即它的各次谐波都具有相等的幅度 $1 / \mathrm{T}$ 。 75 | 76 | 77 | 78 | 79 | #### 理想抽样信号 $\hat{x}_{a}(t)$ 的频谱 80 | 81 | $$ 82 | \hat{x}_{\mathrm{a}}(t)=x_{\mathrm{a}}(t) \cdot p(t) 83 | $$ 84 | 其中 85 | $$ 86 | p(t)=\delta_{T}(t)=\frac{1}{T} \sum_{n=-\infty}^{\infty} e^{j n \Omega_{s}} 87 | $$ 88 | 下面求得 $P(j\Omega)$ 89 | 由傅里叶变化得频移性质 90 | $$ 91 | e^{j \Omega}_{s} t \harr 2 \pi \delta\left(j \Omega-j \Omega_s\right) 92 | $$ 93 | 因此 94 | $$ 95 | P(j \Omega)=\frac{2 \pi}{T} \sum_{n-\infty}^{\infty} \delta\left(j \Omega-j n \Omega_{s}\right) 96 | $$ 97 | 由频域卷积定理: 98 | $$ 99 | \hat{X}_{\mathrm{a}}(j \Omega)=\frac{1}{2\pi}\left[X_{\mathrm{a}}(j \Omega) * P(j \Omega)\right] 100 | $$ 101 | 求得 102 | $$ 103 | \begin{aligned} 104 | \hat{X}_{a}(j \Omega) 105 | &=\frac{1}{2 \pi}\left[X_{a}(j \Omega) * \frac{2 \pi}{T} \sum_{n-\infty}^{\infty} \delta\left(j \Omega-j n \Omega_{s}\right)\right]\\ 106 | &=\frac{1}{T} \sum_{n=-\infty}^{\infty} X_{a}\left(j \Omega-j n \Omega_{s}\right) 107 | \end{aligned} 108 | $$ 109 | 上式表明: 110 | 111 | - 频谱产生周期延拓。即抽样信号的频谱是频率的周期函数,其周期为 $\Omega_{\mathrm{s}}$ 。 112 | 113 | - 频谱的幅度是 $X_{a}(j \Omega)$ 的 $\frac{1}{T}$ 倍。 114 | 115 | ![image-20220720214733676](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20220720214733676.png) 116 | 117 | ## 时域抽样定理 118 | 119 | 如果信号 $x_{\mathrm{a}}(\mathrm{t})$ 是**带限信号**, 且最高频率不超过 $\Omega_{\mathrm{s}} / 2$, 即 120 | $$ 121 | X_{a}(j \Omega)=\begin{cases} 122 | X_{a}(j \Omega) & |\Omega|<\Omega_{s} / 2 \\ 123 | 0 & |\Omega| \geq \Omega_{s} / 2 124 | \end{cases} 125 | $$ 126 | 则抽样频谱中, 基带频谱以及各次谐波调制频谱彼此是不重叠的。 127 | 128 | 用一个带宽为 $\Omega_{\mathrm{s}} / 2$ 的理想低通滤波器, 可以不失真的还原出原来的连续信号。 129 | 130 | 示意图如下: 131 | 132 | 133 | 134 | 但如果信号最高频谱超过 $\Omega/2$ 那么在抽样频谱中,各次调制频率就会相会交叠起来,这就是**频谱混叠现象**。 135 | 其中, $\Omega_s/2$ 或 $f_s/2$ ,称作折叠频率。 136 | 137 | 138 | 139 | 140 | 结论:为使抽样后能不失真的还原出原信号, 抽样频率必须大于等于两倍信号最高频率, 这就是**奈奎斯特抽样定理**。 141 | $$ 142 | f_{s} \geq 2 f_{\max } 143 | $$ 144 | 注意:单一频率时, $f_{s}>2 f_{0}$ 145 | 146 | 147 | ## 抽样的恢复 (内插) 148 | 149 | ### 频域分析(从工程实现角度) 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | $$ 158 | G(j \Omega)=\begin{cases} 159 | T & |\Omega|<\Omega_s/2\\ 160 | 0 & |\Omega|>\Omega_s/2 161 | \end{cases}\\ 162 | \\ 163 | \begin{aligned} 164 | Y(j \Omega) &=\hat{X}_{a}(j \Omega) \cdot G(j \Omega) \\ 165 | &=\frac{1}{T} X_{a}(j \Omega) \cdot G(j \Omega) \\ 166 | &=X_{a}(j \Omega) 167 | \end{aligned}\\ 168 | \\ 169 | y(t)=x_{a}(t) 170 | $$ 171 | 172 | ### 时域分析(从数学角度) 173 | 174 | 把输出看成是 $\hat{x}_{a}(t)$ 与理想低通单位冲激响应 $g(t)$ 的卷积。 175 | 176 | 理想低通 $G(j \Omega)$ 的冲激响应为 177 | $$ 178 | g(t) 179 | =\frac{1}{2 \pi} \int_{-\infty}^{\infty} G(j \Omega) e^{j \Omega t} d \Omega 180 | =\frac{T}{2 \pi} \int_{-\Omega_{s} / 2}^{\Omega_{s} / 2} e^{j \Omega t} d\Omega 181 | =\frac{\sin \frac{\Omega_{s}}{2} t}{\frac{\Omega_{s}}{2} t}=\frac{\sin \frac{\pi}{T} t}{\frac{\pi}{T} t}\\ 182 | $$ 183 | 184 | ![](https://i2.100024.xyz/2022/07/03/10ywctm.webp) 185 | 根据卷积公式, 低通滤波器的输出为: 186 | 187 | $$ 188 | \begin{aligned} 189 | y(t) &=x_{a}(t)=\int_{-\infty}^{\infty} x_{a}(\tau) g(t-\tau) d \tau \\ 190 | &=\int_{-\infty}^{\infty}\left[\sum_{n=-\infty}^{\infty} x_{a}(\tau) \delta(\tau-n T)\right] g(t-\tau) d \tau \\ 191 | &=\sum_{n=-\infty}^{\infty} \int_{-\infty}^{\infty} x_{a}(\tau) g(t-\tau) \delta(\tau-n T) d \tau \\ 192 | &=\sum_{n=-\infty}^{\infty} x_{a}(n T) g(t-n T)=\sum_{n=-\infty}^{\infty} x_{a}(n T) \frac{\sin \left[\frac{\pi}{T}(t-n T)\right]}{\frac{\pi}{T}(t-n T)} 193 | \end{aligned} 194 | $$ 195 | 196 | 抽样内插公式 197 | 198 | $$ 199 | x_a(t)=\sum_{n=-\infty}^{\infty}&x_a(nT) \frac{sin[\frac{\pi}{T} (t-nT)]}{\frac{\pi}{T} (t-nT)}&\\ 200 | $$ 201 | - 权 202 | 203 | $$ 204 | x_a(nT) 205 | $$ 206 | - 内插函数 207 | 208 | $$ 209 | \frac{sin[\frac{\pi}{T} (t-nT)]}{\frac{\pi}{T} (t-nT)} 210 | $$ 211 | 内插结果使得被恢复的信号在抽样点的值就等于 $x_{a}(nT)$ ,抽样点之间的信号则是由各抽样值内插函数的波形延伸叠加而成的。 212 | 213 | ![](https://i2.100024.xyz/2022/07/03/10ziecx.webp) 214 | 215 | 216 | 抽样内插公式说明, 只要抽样频率高于两倍信号最高频率, 则整个连续信号就可以完全用它的抽样值来代表, 而不丢掉任何信息。 这就是奈奎斯特定理的意义。 217 | 218 | 要完全恢复原来的连续信号 $x_{\mathrm{z}}(t)$, 需要以下条件 219 | 220 | 1. 限带信号; 221 | 222 | 2. 无限次的理想取样 ( $\delta$ 函数 ) ;$(N \rightarrow \infty)$ 223 | 224 | 3. 理想低通滤波器, 即 Sinc内揷函数(其截止频率满足 $f_{\mathrm{c}} \leq f \leq f_{\mathrm{s}} / 2$ ) 225 | 226 | 但后两条在物理上都是不可实现的, 因此, 原始信号在实际中不能由抽样真实的重建, 而只能逼近原来的信号。 227 | 228 | (编者注:事实上第一条也无法真正意义上实现,因为哪怕使用了抗混叠滤波器,实际存在的滤波器阻带衰减总是大于0) 229 | 230 | ## 本章小结 231 | 232 | - 常用的基本序列有单位脉冲序列、单位阶跃序列、矩形序列、实指数序列、 正弦型序列、复指数序列和周期序列等。 233 | 234 | - 任意序列都可以表示成单位脉冲序列的移位加权和。 235 | 236 | $$ 237 | x(n)=\sum_{m-\infty}^{\infty} x(m) \delta(n-m) 238 | $$ 239 | 240 | - 线性系统、移不变系统的特点和判别方法。 241 | 242 | - 线性移不变离散系统的卷积和表示: 243 | $$ 244 | y(n)=\sum_{m=\infty}^{\infty} x(m) h(n-m)=x(n) * h(n) 245 | $$ 246 | 即线性移不变系统的输出序列等于输入序列和系统单位脉种响应的线性卷积——线性时不变系统的重要特性。 247 | 248 | - 线性移不变系统因果、稳定的时域充分必要条件: 249 | 250 | $$ 251 | \begin{aligned} 252 | &h(n)=0, \quad n<0 \\ 253 | &\sum_{n=-\infty}^{\infty}|h(n)|<\infty 254 | \end{aligned} 255 | $$ 256 | 257 | - 一个 $N$ 阶常系数线性差分方程的一般形式: 258 | 259 | $$ 260 | y(n)=\sum_{r=0}^{N} b_{r} x(n-r)-\sum_{k=1}^{N} a_{k} y(n-k) 261 | $$ 262 | 263 | - 抽样定理是用数字信号处理技术处理模拟信号的理论基础。只有满足抽样定理的要求, 即 $f_{s} \geq 2 f_{s}$ 才能避免抽样信号中的频谱混叠现象, 才有可能不失真地恢复原来的信号。 -------------------------------------------------------------------------------- /digital-signal-processing/7.离散系统的频域表征.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 离散LSI系统的频域表征 4 | 5 | ## LSI系统的时域表征 6 | 7 | - 单位抽样响应 $h(n)$ 8 | 9 | $$ 10 | \begin{aligned} 11 | &h(n)=T[\delta(n)] \\ 12 | &y(n)=x(n) * h(n)=\sum_{n=-\infty}^{\infty} x(m) h(n-m) \sum_{n=-\infty}^{\infty} h(m) x(n-m) 13 | \end{aligned} 14 | $$ 15 | 16 | - 常系数差分方程 17 | 18 | $$ 19 | y(n)=\sum_{m=0}^{M} b_{m} x(n-m)-\sum_{k=1}^{N} a_{k} y(n-k) 20 | $$ 21 | 22 | 23 | 24 | ## LSI系统的z域表征 25 | 26 | - 系统函数 $H(z)$ :单位抽样响应 $h(n)$ 的 $z$ 变换 27 | 28 | $$ 29 | H(z)=\sum_{n=-\infty}^{\infty} h(n) z^{-n} 30 | $$ 31 | 32 | 此时, 在z域中零状态条件下的输入输出关系为: 33 | 34 | $$ 35 | Y(z)=X(z) H(z) \\ 36 | H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_{m=0}^{M} b_{m} z^{-m}}{1+\sum_{k=1}^{N} a_{k} z^{-k}} 37 | $$ 38 | 39 | **各系数+收敛范围, 才能唯一确定一个LSI系统。** 40 | 41 | ## LSI系统的频域表征 42 | 43 | - LSI系统的频率响应 $H\left(e^{j \omega}\right)$ :单位圆上的系统函数,也是单位抽样响应 $h(n)$ 的Fourier变换 44 | 45 | $$ 46 | H\left(e^{j \omega}\right)=\left.H(z)\right|_{z=e^{j \omega}}=\mathrm{D} \mathrm{TFT}[h(n)] 47 | $$ 48 | 49 | $$ 50 | x(n) \longrightarrow \boxed{H(e^{j\omega})}\longrightarrow y(n) 51 | $$ 52 | 53 | 其中 54 | 55 | $$ 56 | x(n)=\frac{1}{2 \pi} \int_{-\pi}^{\pi} X\left(e^{j \omega}\right) e^{j \omega n} d \omega \\ 57 | Y\left(e^{j \omega}\right)=X\left(e^{j \omega}\right) H\left(e^{j \omega}\right)\\ 58 | y(n)=\frac{1}{2 \pi} \int_{-\pi}^{\pi} Y(e^{j\omega}) e^{j \omega n} d \omega=\frac{1}{2 \pi} \int_{-\pi}^{\pi} X\left(e^{j \omega}\right) H\left(e^{j \omega}\right) e^{j \omega n} d \omega \\ 59 | $$ 60 | 61 | - 从特征函数角度解释DTFT卷积定理 62 | 63 | 64 | $$ 65 | x(n)&&y(n)\\ 66 | \\ 67 | e^{j\omega n} & & e^{j\omega n} H(e^{j\omega})\\ 68 | \dfrac{1}{2\pi}X(e^{j\omega})e^{j\omega n}d\omega & \longrightarrow \boxed{\text{LSI系统}} \longrightarrow& \dfrac{1}{2\pi}X(e^{j\omega})H(e^{j\omega})e^{j\omega n}d\omega\\ 69 | \dfrac{1}{2\pi} \int_{-\pi}^{\pi} X(e^{j\omega})e^{j\omega n}d\omega && \dfrac{1}{2\pi}\int_{-\pi}^{\pi} X(e^{j\omega})H(e^{j\omega})e^{j\omega n}d\omega\\ 70 | $$ 71 | (编者注:为什么输入是 $e^{j\omega n}$ 而输出是 $e^{j\omega n} H(e^{j\omega})$ 见后文“LSI系统对复指数序列的稳态响应”一节) 72 | 73 | 即得 74 | $$ 75 | y(n)=\text{IDTFT}[X(e^{j\omega})H(e^{j\omega})]\\ 76 | Y(e^{j\omega})=X(e^{j\omega})H(e^{j\omega}) 77 | $$ 78 | 而同时 79 | $$ 80 | y(n)=x(h)*h(n) 81 | $$ 82 | 卷积定理得证 83 | 84 | 85 | 86 | ## 因果稳定系统 87 | 88 | - 因果系统 89 | 90 | 要求ROC具有如下形式 91 | $$ 92 | R_{x^{-}}<|z| \leq \infty 93 | $$ 94 | 说明因果系统的收敛域是以原点为圆心的圆外 95 | 96 | - 稳定: 97 | 98 | 序列 $h(n)$ 绝对可和, 即 99 | $$ 100 | \sum_{n=-\infty}^{\infty}|h(n)|<\infty 101 | $$ 102 | 而 $h(n)$ 的 $z$ 变换的ROC: 103 | $$ 104 | \sum_{n=-\infty}^{\infty}\left|h(n) z^{-n}\right|<\infty 105 | $$ 106 | 因此,稳定系统的系统函数 $H(z)$ 的ROC须包含单位圆,即**频率响应存在且连续**。 107 | 108 | 结论:因果稳定系统的ROC须满足如下两个条件 109 | 110 | $$ 111 | r<|z| \leq \infty \\ 112 | 0 233 | 234 | 利用H(z)在z平面上的零极点分布 235 | 236 | $$ 237 | H(z)=K \frac{\prod_{m=1}^{M}\left(1-c_{m} z^{-1}\right)}{\prod_{i=1}^{N}\left(1-d_{k} z^{-1}\right)}=K z^{(N-M)} \frac{\prod_{m=1}^{M}\left(z-c_{m}\right)}{\prod_{i=1}^{N}\left(z-d_{k}\right)} 238 | $$ 239 | 240 | 将 $z=e^{j \omega}$ 带入上式, 频率响应: 241 | 242 | $$ 243 | H\left(e^{j \omega}\right)=K e^{j(N-M) \omega} \frac{\prod^{M}_{m-1}\left(e^{j \omega}-c_{m}\right)}{\prod_{k=1}^{N}\left(e^{j \omega}-d_{k}\right)}=\left|H\left(e^{j \omega}\right)\right| e^{j \arg [H(e^{j \omega})]} 244 | $$ 245 | 其中 246 | $$ 247 | \left|H\left(\mathrm{e}^{\mathrm{j} \omega}\right)\right|=|K| \frac{\prod_{m=1}^{M}\left|\mathrm{e}^{\mathrm{j} \omega}-c_{m}\right|}{\prod_{k=1}^{N}\left|\mathrm{e}^{\mathrm{j} \omega}-d_{k}\right|}\\ 248 | \arg \left[H\left(\mathrm{e}^{\mathrm{j} \omega}\right)\right]=\arg [K]+\sum_{m=1}^{M} \arg \left[\mathrm{e}^{\mathrm{j} \omega}-c_{m}\right]-\sum_{k=1}^{N} \arg \left[\mathrm{e}^{\mathrm{j} \omega}-d_{k}\right]+(N-M) \omega 249 | $$ 250 | 现定义 251 | 252 | - 零矢 253 | 254 | $$ 255 | \bar{c}_{m}=e^{j \omega}-c_{m}=\rho_{m} e^{j \theta_{m}} 256 | $$ 257 | - 极矢: 258 | 259 | $$ 260 | \overline{d}_{k}=e^{j \omega}-d_{k}=l_{k} e^{j \phi_{k}} 261 | $$ 262 | 重写上式 263 | $$ 264 | H\left(e^{j \omega}\right)=K e^{j(N-M) \omega} \frac{\prod_{m=1}^{M} \bar{c}_{m}}{\prod_{k=1}^{N} \bar{d}_{k}} 265 | =\left|H\left(e^{j \omega}\right)\right| e^{j \varphi(\omega)}\\ 266 | \left|H\left(e^{j \omega}\right)\right|=|K| \frac{\prod_{m=1}^{M} \rho_{m}}{\prod_{k=1}^{N} l_{k}}\\ 267 | \varphi(\omega)=\arg [K]+\sum_{m=1}^{M} \theta_{m}-\sum_{k=1}^{N} \phi_{k}+(N-M) \omega 268 | $$ 269 | 270 | 271 | 因此频率的振幅函数就可以从各零、极点指向点 $e^{j\omega}$ 的向量幅度来确定,频响的相位函数则由这些向量的辐角所确定。 272 | 273 | 当频率 $\omega$ 由 0 到 $2 \pi$ 时, 这些向量的终点沿单位圆逆时针方向旋转一周, 从而可以估算出整个系统的频响来。 ![](https://cdn.mathpix.com/cropped/2022_06_17_ab137c3550a7519427b5g-37.jpg?height=392&width=1060&top_left_y=312&top_left_x=284) 274 | 275 | - 原点处的极点和零点对频率响应的幅度无影响,它们只是在相位中引入一个线性分量; 276 | 277 | - 极点主要影响频响的峰值,极点越靠近单位圆,峰值就越尖锐,当极点处于单位圆上,该点的频值就出现 $\infty$ ,这相当于该频率处出现无耗谐振; 278 | 279 | - 零点主要影响频响的谷值,零点越靠近单位圆,谷值越小, 当处于单位圆上时,幅度为0。 -------------------------------------------------------------------------------- /digital-image-processing/II/2.7 小波变换简介.md: -------------------------------------------------------------------------------- 1 | # 2.7 小波变换简介 2 | 3 | ## 2.7.1 小波变换的理论基础 4 | 5 | 本质:任何信号都是由低频+高频信号合成可进一步分解 6 | 7 | 信号分析是为了获得时间和频率之间的相互关系。傅立叶变换提供了有关频率域的信息, 但有关时间的局部化信息却基本丢失。与傅立叶变换不同, 小波变换是通过缩放母小波 (Mother wavelet)的宽度来获得信号的频率特征, 通过平移母小波来获得信号的时间信息。对母小波的缩放和平移操作是为了计算小波系数, 这些小波系数反映了小波和局部信号之间的相关程度。 8 | 9 | ### 连续小波变换(CWT) 10 | 11 | 像傅立叶分析一样, 小波分析就是把一个信号分解为将母小波经过缩放和平移之后的一系列小波, 因此小波是小波变换的基函数。小波变换可以理解为用经过缩放和平移的一系列小波函数代替傅立叶变换的正弦波和余弦波进行傅立叶变换的结果。 12 | 13 | 图7-13表示了正弦波和小波的区别, 由此可以看出, 正弦波从负无穷一直延续到正无穷, 正弦波是平滑而且是可预测的, 而小波是一类在有限区间内快速衰减到 0 的函数, 其平均值为 0 , 小波趋于不规则、不对称。 14 | 15 | image-20230427153813312 16 | 17 | 图2-13 正弦波和小波 18 | (a)正弦波曲线; (b) 小波曲线 19 | 20 | 从小波和正弦波的形状可以看出, 变化剧烈的信号, 用不规则的小波进行分析比用平滑的正弦波更好, 即用小波更能描述信号的局部特征。 21 | 22 | 连续小波变换 (Continuous Wavelet Transform, CWT) 用下式表示: 23 | 24 | $$ 25 | C(\text { scale, position })=\int_{-\infty}^{+\infty} f(t) \psi( { scale, position, } t) d t 26 | $$ 27 | 28 | 式 (2-79) 表示小波变换是信号 $f(x)$ 与被缩放和平移的小波函数 $\psi()$ 之积在信号存在的整个期间里求和的结果。CWT的变换结果是许多小波系数 $C$, 这些系数是缩放因子 (scale) 和平移 (positon) 的函数。 29 | 30 | 基本小波函数 $\psi()$ 的缩放和平移操作含义如下: 31 | 32 | 图2-14 小波的缩放操作 33 | 34 | (2) 平移。简单地讲, 平移就是小波的延迟或超前。在数学上, 函数 $f(t)$ 延迟 $k$ 的表达式为 $f(t-k)$, 如图2-15所示。 35 | 36 | image-20230503095911885 37 | 38 | image-20230503095952459 39 | 40 | 图2-15 小波的平移操作 41 | 42 | (a) 小波函数 $\psi(t)$; (b) 位移后的小波函数 $\psi(t-k)$ 43 | 44 | CWT计算主要有如下五个步骤: 45 | 46 | 1. 取一个小波, 将其与原始信号的开始一节进行比较。 47 | 48 | 2. 计算数值C, C表示小波与所取一节信号的相似程度, 计算结果取决于所选小波的形状, 如图2-16所示。 49 | 50 | 3. 向右移动小波, 重复第一步和第二步, 直至覆盖整个信号, 如图2-17所示。 51 | 52 | 4. 伸展小波, 重复第一步至第三步, 如图2-18所示。 53 | 54 | 55 | 56 | 图2-16 计算系数值 $C$ 57 | 58 | 59 | 60 | 图2-17 计算平移后系数值 $C$ 61 | 62 | 63 | 64 | 65 | 66 | 图2-18 计算尺度后系数值 $C$ 67 | 68 | 5. 对于所有缩放,重复第一步至第四步。 69 | 70 | 小波的缩放因子与信号频率之间的关系是:缩放因子 scale 71 | 越小, 表示小波越窄, 度量的是信号的细节变化, 表示信号频率越高; 缩放因子scale越大, 表示小波越宽, 度量的是信号的粗䊁程度,表示信号频率越低。 72 | 73 | ### 离散小波变换(DWT) 74 | 75 | 在每个可能的缩放因子和平移参数下计算小波系数, 其计算量相当大, 将产生惊人的数据量, 而且有许多数据是无用的。如果缩放因子和平移参数都选择为 $2^{j}(j>0$ 且为整数) 的倍数,即只选择部分缩放因子和平移参数来进行计算, 就会使分析的数据量大大减少。使用这样的缩放因子和平移参数的小波变换称为双尺度小波变换(Dyadic Wavelet Transform),它是离散小波变换(Discrete Wavelet Transform,DWT)的一种形式。通常离散小波变换就是指双尺度小波变换。 76 | 77 | 执行离散小波变换的有效方法是使用滤波器, 该方法是Mallat于1988年提出的,称为Mallat算法。这种方法实际上是一种信号分解的方法, 在数字信号处理中常称为双通道子带编码。 78 | 79 | 用滤波器执行离散小波变换的概念如图2-19所示。S表示原始的输入信号, 通过两个互补的滤波器组, 其中一个滤波器为低通滤波器, 通过该滤波器可得到信号的近似值 $A$(Approximations), 另一个为高通滤波器, 通过该滤波器可得到信号的细节值$D$(Detail)。 80 | 81 | 82 | 83 | 84 | 85 | 图2-19 小波分解示意图 86 | 87 | 在小波分析中,近似值是大的缩放因子计算的系数,表示信号的低频分量, 而细节值是小的缩放因子计算的系数, 表示信号的高频分量。实际应用中, 信号的低频分量往往是最重要的, 而高频分量只起一个修饰的作用。如同一个人的声音一样, 把高频分量去掉后, 听起来声音会发生改变, 但还能听出说的是什么内容, 但如果把低频分量删除后, 就会什么内容也听不出来了。 88 | 89 | 由图2-19可以看出离散小波变换可以表示成由低通滤波器和高通滤波器组成的一棵树。原始信号经过一对互补的滤波器组进行的分解称为一级分解, 信号的分解过程也可以不断进行下去, 也就是说可以进行多级分解。如果对信号的高频分量不再分解, 而对低频分量进行连续分解, 就可以得到信号不同分辨率下的低频分量, 这也称为信号的多分辨率分析。如此进行下去, 就会形成图2-20所示的一棵比较大的分解树, 称其为信号的小波分解树 (Wavelet Decomposition Tree)。实际中,分解的级数取决于要分析的信号数据特征及用户的具体需要。 90 | 91 | 92 | 93 | 图2-20 多级信号分解示意图 94 | (a) 信号分解; (b) 小波分数; (c)小波分解树 95 | 96 | image-20230427160105238 97 | 98 | 图2-21 小波分解下采样示意图 99 | 100 | ### 小波重构 101 | 102 | 将信号的小波分解的分量进行处理后, 一般还要根据需要 103 | 104 | 把信号恢复出来, 也就是利用信号的小波分解的系数还原出原始信号, 这一过程称为小波重构(Wavelet Reconstruction)或叫做小波合成(Wavelet Synthesis)。这一合成过程的数学运算叫做逆离散小波变换 ( Inverse Discrete Wavelet Transform, IDWT)。 105 | 106 | 107 | 108 | 图2-22 小波重构算法示意图 109 | 110 | #### 重构近似信号与细节信号 111 | 112 | 由图2-22可知, 由小波分解的近似系数和细节系数可以重构出原始信号。同样, 可由近似系数和细节系数分别重构出信号的近似值或细节值, 这时只要近似系数或细节系数置为零即可。 113 | 114 | 图2-23是对第一层近似信号或细节信号进行重构的示意图。 115 | 116 | image-20230427160213641 117 | 118 | 图2-23 重构近似和细节信号示意 119 | 120 | (a)重构近似信号; (b) 重构细节信号 121 | 122 | #### 多层重构 123 | 124 | 在图2-23中, 重构出信号的近似值 $A_{1}$ 与细节值 $D_{1}$ 之后, 则原信号可用 $A_{1}+D_{1}=S$ 重构出来。对应于信号的多层小波分解, 小波的多层重构如图2-24所示。由图2-24可见重构过程为: 125 | $$ 126 | A_3+D_3=A_2\\ 127 | A_2+D_2=A_1\\ 128 | A_1+D_1=S 129 | $$ 130 | 信号重构中, 滤波器的选择非常重要, 关系到能否重构出满意的原始信号。低通分解滤波器 (L) 和高通分解滤波器 (H) 及重构滤波器组 $\left(L^{\prime}\right.$ 和 $\left.H^{\prime}\right)$ 构成一个系统, 这个系统称为正交镜像滤波器(Quadrature Mirror Filters, QMF)系统, 如图7-25 所示。 131 | 132 | image-20230427160652742 133 | 134 | 图2-24 多层小波重构示意图 135 | 136 | ![](https://cdn.mathpix.com/cropped/2023_03_29_c6380eb52646648cbc7eg-26.jpg?height=814&width=2408&top_left_y=403&top_left_x=49) 137 | 138 | 图2-25 多层小波分解和重构示意图 139 | 140 | ### 小波包分析 141 | 142 | 小波分析是将信号分解为近似与细节两部分, 近似部分又可以分解成第二层近似与细节, 可以这样重复下去。对于一个 $N$层分解来说, 有 $N+1$ 个分解信号的途径。而小波包分析的细节与近似部分一样, 也可以分解, 对于 $N$层分解, 它产生 $2 N$ 个不同的途径, 图2-26是一个小波包分解示意图。 143 | 144 | 145 | 146 | 图2-26 小波包分解示意图 147 | 148 | 小波包分解也可得到一个分解树,称其为小波包分解树(Wavelet Packet Decomposition Tree),\cjkstart这种树是一个完整的二义树。小波包分解方法是小波分解的一般化,可为信号分析提供更丰富和更详细的信息。信号 $S$ 可表示为$AA_2+ADA_3+DDA_3+D_1$等。 149 | 150 | ### 二维离散小波变换 151 | 152 | 二维离散小波变换是一维离散小波变换的推广,其实质上是将二维信号在不同尺度上的分解, 得到原始信号的近似值和细节值。由于信号是二维的, 因此分解也是二维的。分解的结果为:近似分量cA、水平细节分量 $cH$ 、垂直细节分量cV和对角细节分量cD。同样也可以利用二维小波分解的结果在不同尺度上重构信号。二维小波分解和重构过程如图2-27所示。 153 | 154 | image-20230427160820730 155 | 156 | 图2-27二维小波分解和重构过程示意图 157 | (a)二维DWT; (b) 二维IDWT 158 | 159 | ## 2.7.2 离散小波变换在图像处理中的应用简介 160 | 161 | ### 用小波变换进行图像分解 162 | 163 | 使用小波变换完成图像分解的方法很多,例如,均匀分解 ( Uniform decomposition ) 、非均匀分解 ( Non-uniform decomposition)、八带分解(Octave-band decomposition)、小波包分解 (Wavelet-packer decomposition) 等。其中八带分解是使用最广的一种分解方法, 这种分解方法把低频部分分解成比较窄的频带, 而对每一级分解得到的高频部分不再进一步进行分解。 图2-28为八带分解示意图, 用于分解的原始图像采用Matlab提供的预存图像文件woman2.mat,小波基函数为 “haar"小波。图228 (c)是用Matlab的小波工具箱编程进行分解得到的图像。 164 | 165 | ![image-20230427160902436](https://mypic-1312707183.cos.ap-nanjing.myqcloud.com/image-20230427160902436.png) 166 | 167 | 图2-28 八带分解示意图 168 | 169 | (a) 一次二维DWT; (b) 两次二维DWT; (c) Woman二级分解图 170 | 171 | ### 用小波变换进行图像处理 172 | 173 | 对静态二维数字图像,可先对其进行若干次二维DWT变换, 174 | 175 | 将图像信息分解为高频成分 $H 、 V$ 和 $D$ 和低频成分 $A$ 。对低频部分 176 | 177 | A,由于它对压缩的结果影响很大,因此可采用无损编码方法, 178 | 179 | 如Huffman、DPCM等;对 $H 、 V$ 和 $D$ 部分,可对不同的层次采用不同策略的向量量化编码方法, 这样便可大大减少数据量, 而图像的解码过程冈好相反。整个编码、解码流程如图2-29所示。 180 | 181 | ![](https://cdn.mathpix.com/cropped/2023_03_29_c6380eb52646648cbc7eg-35.jpg?height=587&width=2437&top_left_y=430&top_left_x=47) 182 | 183 | 图2-29 图像压缩编码、解码流程此外,还可以在对 $A 、 H 、 V$ 和 $D$ 部分编码后加上一个反馈环节,获取误差图像,并对其编码。这样压缩效果会更好。 184 | 185 | 近年来,基于小波变换发展起来的图像编码有嵌入式零树小波编码EZW(Embedded Zerotree Wavelet)及在EZW算法基础上改进的层树分级编码SPIHT( Set Parition In HierarchicalTrees) 和最佳截断嵌入码块编码EBCOT (Embedded Block Coding with Optimized Truncation ) 等。ISO/IEC JTC1 SC29 小组制定的 JPEG2000静态图像编码标准中的图像变换技术就采用了离散小波变换,这些编码的最大特点是在不丢失重要信息的同时,能以较高的比率压缩图像数据,并且其算法计算量小。 --------------------------------------------------------------------------------