目录
前言
临近期末考试,为了复习图像处理,本人特地写下此篇文章。本文仅供参考学习,后续有时间陆续补充,若有错误欢迎指出!
第一章 基本概念
1、BMP结构图
以下来自知乎博主@Lovelessing的图,画的很详细清晰
2、BMP文件结构
bmp文件 { (14字节)位图文件头 (File Header) { (2字节)文件类型 (Type) (4字节)文件大小 (Size) ⟶ 位图文件头长度 + 位图信息头长度 + 调色板 + 位图数据 (4字节)保留数据 (Reserved) { (2字节)Reserved1 ⟶ 默认为 0 (2字节)Reserved2 ⟶ 默认为 0 (Reserved无含义,仅为以后新添属性留位置) (4字节)偏移量 (Offset) ⟶ 位图文件头长度 + 位图信息头长度 + 调色板 (40字节)位图信息头 (DIB Header) { (4字节)文件信息头长度 (DIB Header Size) ⟶ 40 (4字节)图像宽度 (Image Width) (4字节)图像高度 (Image Height) (2字节)颜色平面数 (Plane) ⟶ 默认为 1 (2字节)图像位数 (Bit Pixel) { 2 位 ⟶ 黑白图 ( 二值 ) 8 位 ⟶ 灰度图 24 位 ⟶ 真彩图 32 位 ⟶ 真彩图 + 透明度(Alpha) (4字节)压缩方式 (Compression) ⟶ 默认为 0 , 表示不压缩 (4字节)位图数据大小 (Image Size) ⟶ ( 图像宽度 ⋅ 图像高度 ⋅ 图像位数 ) ÷ 8 ( 8 字节 ) 分辨率(Pixels) { (4字节)横向分辨率 (X Pixels) (4字节)纵向分辨率 (Y Pixels) (4字节)调色板颜色数 (Colors) { 24 位图像 ⟶ 0 8 位图像 ⟶ 256 2 位图像 ⟶ 2 (4字节)重要颜色数 (Important Color) ⟶ 默认为最大值,表示都重要 颜色板 (Color Table) { 无调色板 ⟶ 24 位图像 含调色板 { 8 位图像 ⟶ 256位结构体 (rgbq) { Blue Green Red Reserved ⟶ 默认为 0 (Reserved无含义,仅用于填充到4字节) 2 位图像 ⟶ 黑白调色板 { Black White 位图数据 (Data) { 24位图像 ⟶ 三色通道 (Blue,Green,Red) 8位图像 ⟶ 灰度值 (Gray) 2位图像 ⟶ 二进值 { 0 ⟶ 白色 1 ⟶ 黑色 \text{bmp文件}\left\{ \begin{array}{lr} \text{(14字节)位图文件头 (File Header)} \left\{ \begin{array}{lr} \text{(2字节)文件类型 (Type) }\\ \text{(4字节)文件大小 (Size)}\longrightarrow \text{位图文件头长度 + 位图信息头长度 + 调色板 + 位图数据} \\ \text{(4字节)保留数据 (Reserved)} \left\{ \begin{array}{lr} \text{(2字节)Reserved1} \longrightarrow默认为0\\ \text{(2字节)Reserved2}\longrightarrow默认为0 \end{array} \right.\\ \text{(Reserved无含义,仅为以后新添属性留位置)}\\ \text{(4字节)偏移量 (Offset)}\longrightarrow \text{位图文件头长度 + 位图信息头长度 + 调色板} \end{array} \right.\\ \text{(40字节)位图信息头 (DIB Header)} \left\{ \begin{array}{lr} \text{(4字节)文件信息头长度 (DIB Header Size)}\longrightarrow40\\ \text{(4字节)图像宽度 (Image Width)}\\ \text{(4字节)图像高度 (Image Height)} \\ \text{(2字节)颜色平面数 (Plane)}\longrightarrow默认为1 \\ \text{(2字节)图像位数 (Bit Pixel)} \left\{ \begin{array}{lr} 2位\longrightarrow黑白图(二值)\\ 8位\longrightarrow灰度图\\ 24位\longrightarrow真彩图\\ 32位\longrightarrow真彩图 + 透明度\text{(Alpha)} \end{array} \right.\\ \\ \text{(4字节)压缩方式 (Compression)}\longrightarrow默认为0,表示不压缩\\ \text{(4字节)位图数据大小 (Image Size)}\longrightarrow(图像宽度 \cdot 图像高度\cdot图像位数)\div8\\ (8字节)分辨率 \text{(Pixels)} \left\{ \begin{array}{lr} \text{(4字节)横向分辨率 (X Pixels)}\\ \text{(4字节)纵向分辨率 (Y Pixels)}\\ \end{array} \right.\\ \text{(4字节)调色板颜色数 (Colors)} \left\{ \begin{array}{lr} 24位图像 \longrightarrow 0\\ 8位图像 \longrightarrow 256\\ 2位图像 \longrightarrow 2 \\ \end{array} \right. \\ \text{(4字节)重要颜色数 (Important Color)}\longrightarrow 默认为最大值,表示都重要 \end{array} \right.\\ \text{颜色板 (Color Table)} \left\{ \begin{array}{lr} 无调色板\longrightarrow 24位图像\\ 含调色板 \left\{ \begin{array}{lr} 8位图像\longrightarrow \text{256位结构体 (rgbq)} \left\{ \begin{array}{lr} \text{Blue}\\ \text{Green}\\ \text{Red}\\ \text{Reserved}\longrightarrow 默认为0\\ \text{(Reserved无含义,仅用于填充到4字节)} \end{array} \right.\\ 2位图像\longrightarrow \text{黑白调色板} \left\{ \begin{array}{lr} \text{Black}\\ \text{White}\\ \end{array} \right.\\ \text{} \end{array} \right. \end{array} \right.\\\\ \text{位图数据 (Data)} \left\{ \begin{array}{lr} \text{24位图像}\longrightarrow \text{三色通道 (Blue,Green,Red)}\\ \text{8位图像}\longrightarrow \text{灰度值 (Gray)}\\ \text{2位图像}\longrightarrow 二进值 \left\{ \begin{array}{lr} 0\longrightarrow\text{白色}\\ 1\longrightarrow\text{黑色}\\ \end{array} \right.\\ \end{array} \right.\\ \\ \end{array} \right. bmp文件⎩ ⎨ ⎧(14字节)位图文件头 (File Header)⎩ ⎨ ⎧(2字节)文件类型 (Type) (4字节)文件大小 (Size)⟶位图文件头长度 + 位图信息头长度 + 调色板 + 位图数据(4字节)保留数据 (Reserved){(2字节)Reserved1⟶默认为0(2字节)Reserved2⟶默认为0(Reserved无含义,仅为以后新添属性留位置)(4字节)偏移量 (Offset)⟶位图文件头长度 + 位图信息头长度 + 调色板(40字节)位图信息头 (DIB Header)⎩ ⎨ ⎧(4字节)文件信息头长度 (DIB Header Size)⟶40(4字节)图像宽度 (Image Width)(4字节)图像高度 (Image Height)(2字节)颜色平面数 (Plane)⟶默认为1(2字节)图像位数 (Bit Pixel)⎩ ⎨ ⎧2位⟶黑白图(二值)8位⟶灰度图24位⟶真彩图32位⟶真彩图+透明度(Alpha)(4字节)压缩方式 (Compression)⟶默认为0,表示不压缩(4字节)位图数据大小 (Image Size)⟶(图像宽度⋅图像高度⋅图像位数)÷8(8字节)分辨率(Pixels){(4字节)横向分辨率 (X Pixels)(4字节)纵向分辨率 (Y Pixels)(4字节)调色板颜色数 (Colors)⎩ ⎨ ⎧24位图像⟶08位图像⟶2562位图像⟶2(4字节)重要颜色数 (Important Color)⟶默认为最大值,表示都重要颜色板 (Color Table)⎩ ⎨ ⎧无调色板⟶24位图像含调色板⎩ ⎨ ⎧8位图像⟶256位结构体 (rgbq)⎩ ⎨ ⎧BlueGreenRedReserved⟶默认为0(Reserved无含义,仅用于填充到4字节)2位图像⟶黑白调色板{BlackWhite位图数据 (Data)⎩ ⎨ ⎧24位图像⟶三色通道 (Blue,Green,Red)8位图像⟶灰度值 (Gray)2位图像⟶二进值{0⟶白色1⟶黑色
第二章 图像增强
1、均值与方差
均值计算
图像的均值可以通过以下公式计算:
E
(
I
)
=
1
M
N
∑
i
=
1
M
∑
j
=
1
N
I
i
,
j
E(I)=\frac{1}{MN}\sum_{i=1}^{M}\sum_{j=1}^{N}I_{i,j}
E(I)=MN1i=1∑Mj=1∑NIi,j
其中,M和N代表图像的高度和宽度。Ii,j代表原图像中第i行第j列像素点的灰度值。
方差计算
方差是描述数据分散程度的量。对于图像来说,方差值越大,表示图像像素值的分散程度越大,图像的对比度也会相应地增加。方差值可以通过以下公式计算:
V
a
r
(
I
)
=
1
M
N
∑
i
=
1
M
∑
j
=
1
N
(
I
i
,
j
−
E
(
I
)
)
2
Var(I)=\frac{1}{MN}\sum_{i=1}^{M}\sum_{j=1}^{N}(I_{i,j}-E(I))^2
Var(I)=MN1i=1∑Mj=1∑N(Ii,j−E(I))2
其中,E(I)代表图像的均值。
2、直方图
理解:图像中各个灰度值的分布图
直方图的横轴表示像素值,纵轴表示该像素值在图像中出现的次数或占比
3、直方图均衡化
假如班上10个人的成绩排名如下,如何让成绩从0到100都均衡分布呢?
将这四类成绩的区间人数分布情况绘制如下
理想的均衡分布区间情况如下
原分布区间映射到理想分布区间,则此时分布均衡,故需将成绩阈值一一对应即可实现均衡化
本例的成绩即灰度值,直方图均衡化即使灰度值从0到255均衡分布
第三章 图像平滑
以上图中绿色部分为滤波窗口,滤波窗口的半径为滤波半径,像素点G为滤波点,黄色部分为滤波后的图像。
1、均值滤波
均值滤波即像素点G为滤波窗口中所有像素点的均值
2、中值滤波
中值滤波即G为滤波窗口中中所有像素点的的中值,针对椒盐噪声处理效果极佳
第四章 边缘检测
1、一阶微分算子(Sobel)
S o b e l 边缘检测 { x 方向卷积 [ − 1 0 1 − 2 0 2 − 1 0 1 ] y 方向卷积 [ − 1 − 2 − 1 0 0 0 1 2 1 ] \begin{aligned} Sobel边缘检测 \left\{ \begin{array}{lr} x方向卷积 \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \\ \end{bmatrix}\\ \\ y方向卷积 \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \\ \end{bmatrix} \end{array} \right. \nonumber\\ \end{aligned} Sobel边缘检测⎩ ⎨ ⎧x方向卷积 −1−2−1000121 y方向卷积 −101−202−101
G = ( G x ) 2 + ( G y ) 2 \begin{aligned} &G=\sqrt{(G_x)^2+(G_y)^2} \end{aligned} G=(Gx)2+(Gy)2
2、二阶微分算子(Laplace)
L a p l a c e 边缘检测 { 4 领域 [ 0 1 0 1 − 4 1 0 1 0 ] 8 领域 [ 1 1 1 1 − 8 1 1 1 1 ] \begin{aligned} Laplace边缘检测 \left\{ \begin{array}{lr} 4领域 \begin{bmatrix} 0 & 1& 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \\ \end{bmatrix}\\ \\ 8领域 \begin{bmatrix} 1 & 1 & 1 \\ 1 & -8 &1 \\ 1 & 1 & 1 \\ \end{bmatrix} \end{array} \right. \nonumber\\ \end{aligned} Laplace边缘检测⎩ ⎨ ⎧4领域 0101−41010 8领域 1111−81111
第五章 图像分割
1、阈值化
Data[i] = { 255 ,Data[i] ≥ T 0 ,Data[i] < T \text{Data[i]}= \left\{ \begin{array}{lr} 255,\text{Data[i]}\geq T \\ \\ 0,\text{Data[i]}<T\ \end{array} \right. \nonumber\\ Data[i]=⎩ ⎨ ⎧255,Data[i]≥T0,Data[i]<T
第六章 目标检测
1、方向链码
4方向链码
8方向链码
2、循环首差链码
CirculateCode[i] = ( ChainCode[i] − ChainCode[i-1] + 8 ) \text{CirculateCode[i]}=(\text{ChainCode[i]}-\text{ChainCode[i-1]}+8)%8 CirculateCode[i]=(ChainCode[i]−ChainCode[i-1]+8)
3、最小循环首差链码
相邻链码的差代替链码