图像处理与Python实现(岳亚伟)笔记一
一,数字图像处理的目的
数字图像处理是指借助计算机强大的运算能力,运用去噪、特征提取、增强等技术对数字形式存储的图像进行加工、处理。数字图像处理的目的主要有以下3点:
- 提升图像的视觉感知质量:通过亮度、彩色等变换操作,抑制图像中某些成分的表现力,提升图像中特定成分的表现力,以改善图像视觉感知效果
- 提取图像中感兴趣区域或特征:从图像中提取感兴趣区域或特征可以作为图像分类、分割、语义标注等的依据,为计算机图像分析提供进一步便利。按照表示方式的不同,提取的特征可以分为空间域特征和频域特征两大类。按照表达的图像信息的不同,提取的特征可以分为颜色特征、边界特征、区域特征、纹理特征、形状特征及图像结构特征等。
- 方便图像的存储和传输:为了减少图像的存储空间,降低图像在网络传输中的耗时,可首先使用各类编码方法对图像进行编码,然后使用如JPEG\BMP等压缩标准对图像进行压缩
二,图像采样和量化
一幅图像可表示成一个范围有限二维空间内幅值有限的函数,其数学表达为:
$I = f(x, y), x_{start}\leqslant x\leqslant x_{end},y_{start}\leqslant y\leqslant y_{end},I_{min}\leqslant I\leqslant I_{max}$
其中$x, y$表示图像中的空间坐标,$I=f(x,y)$表示图像某个位置的响应值,$x_{start}$和$x_{end}$表示图像在水平方向上的边界,$y_{start}$和$y_{end}$表示图像在垂直方向上的边界,$I_{min}$和$I_{max}$分别表示响应幅值的最小值和最大值。
数字图像中像素的空间位置$x, y$以及响应值$I$均为离散值,而传感器的输出是连续电压波形信号。为了产生一幅数字图像,需要把连续的数据转换为离散的数字化形式。图像的数字化是将连续的模拟图像转换为计算机课处理的离散数字图像的过程,该过程包括两种操作:采样和量化。采样是图像空间坐标的离散化,决定了图像的空间分辨率。量化是图像响应幅值的离散化,决定了图像的灰度分辨率。采样额量化是将模拟图像转换为数字图像的两个最重要的操作。
2.1 图像采样
图像采样是将一幅在空间上连续分布的模拟图像分割成&M*N&的网络,每个网格称为一个像素,$M*N$成为图像的空间分辨率。根据香农采样定理,只要采样的频率大于被采样信号最高频率的2倍,就可以由采样信号对原始信号的形态进行完整恢复。图像采样可以看作是对原始图像信号的一种数字化逼近。对咖啡杯图像进行不同频率采样python代码及所得结果如图1所示。
1 from skimage import data 2 import matplotlib.pyplot as plt 3 import numpy as np 4 5 image = data.coffee() # 导入图像数据 6 ratios = [10, 20, 40, 80] # 设置采样比率 7 c = 1 # 记录子图索引 8 9 # 遍历采样比率,遍历图像数据 10 for ratio in ratios: 11 image1 = np.zeros((int(image.shape[0] / ratio), int(image.shape[1] / ratio), image.shape[2]), dtype='int32') 12 for i in range(image1.shape[0]): 13 for j in range(image1.shape[1]): 14 for k in range(image1.shape[2]): 15 delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k] 16 image1[i][j][k] = np.mean(delta) # 计算均值 17 plt.subplot(2, 2, c) 18 c += 1 19 plt.imshow(image1) 20 plt.title('ratio={}'.format(ratio)) 21 plt.show()
图像采样是对图像空间位置的数字化,采样需要确定水平和垂直方向上分割出像素的数量,该数量又称为图像的分辨率。一般来说,采样间隔越大所得图像像素数越少(上图中ratio表示采样间隔),空间分辨率低,图像质量差,严重时出现马赛克效应;采样间隔越小,所得图像像素数越多,空间分辨率高,图像质量好,但数据量较大。
2.2 图像量化
模拟图像经过采样后,在空间上实现了离散化,并形成像素。但采样所得的像素值(即灰度值)依旧是连续量。采样后所得的各像素的灰度值从连续量到离散量的转换称为图像灰度的量化。图像的像素值(响应值)$I(x,y)$的数字化被称为图像的量化,即将图像响应值$I(x,y)$从$I_{min}$到I_{max}的实数域映射为有限级别的离散数值。图像采样将图像的空间域限定为有限的离散坐标,而图像量化则将图像的响应值限定为有限的离散数值。与图像量化相关的度量为灰度级。灰度级(灰度层次)是表示像素明暗程度的正数量。例如,像素的取值范围为0~255,就称该图像为256个灰度级的图像。图像数据的实际灰度层次越多,视觉效果越好。图2对图像分别进行不同灰度量化的结果,对比图像可以发现256级灰度的细节呈现能力高于其他灰度级。
图2
python代码如下:
1 from skimage import data 2 import matplotlib.pyplot as plt 3 import matplotlib as mpl 4 import numpy as np 5 6 mpl.rcParams['font.sans-serif'] = ['SimHei'] 7 # 量化 8 ratios = [128, 64, 32, 16, 8, 4, 2, 1] 9 c = 1 10 11 # 遍历量化级别和图像数据 12 for r in ratios: 13 image2 = np.zeros(image.shape) 14 for i in range(image.shape[0]): 15 for j in range(image.shape[1]): 16 for k in range(image.shape[2]): 17 image2[i][j][k] = int(int(image[i, j, k] / r) * r) 18 image2 = np.asarray(image2, dtype='int32') 19 plt.subplot(2, 4, c) 20 c += 1 21 plt.imshow(image2) 22 plt.title(u'灰度级为{}'.format(int(256 / r))) 23 plt.show()
图像的量化比率决定了图像的颜色精细程度。目前的一般做法是从图像响应最大值到响应最小值进行均匀量化,划分为若干量化层级。目前常见的量化级数一般为$2^n$,如256.最小的额量化级数为2,即灰度图像转变为二值图像,量化后的图像仅有0和1两种灰度取值。除均匀量化方法外,也存在非均匀量化。
量化等级越多,所得图像层次越丰富,灰度分辨率高,图像质量好,但数据量较大;量化等级越少,图像层次欠丰富,灰度分辨率低,可能会出现假轮廓现象,图像质量变差,但数据量较小。然而,在极少数情况下固定图像大小,减少灰度级能改善质量,产生这种情况的可能原因是减少灰度级一般会增加图像的对比度。例如,对细节比较丰富的图像数字化,可能会减少图像中用户不感兴趣的一些细节,增加感兴趣区域与背景图像的对比度。
1.3 图像的表示和可视化
1.3.1 图像的表示
通过采样和量化,原本连续的图像$I=f(x,y)$转换为要给二维阵列$f(x,y)$,具有M行N列,其中$(x,y)$是离散坐标。一般的,直接用二维矩阵A表示量化后的图像更方便。
二维矩阵式表示数字图像的重要形式。一幅$M*N$的图像可以表示为矩阵,矩阵中的每个元素称为图像的像素。每个像素都有它自己的空间位置和值,值是这一位置像素的颜色或者强度。
按照图像矩阵包含元素不同,大致可以分为二值图像,灰度图像,彩色图像三类:
- 二值图像也称单色图像或1位图像,即颜色深度为1的图像。颜色深度为1表示每个像素点仅占1位,一般用0表示黑,1表示白
- 灰度图像是包含灰度级(亮度)的图像,每个像素由8位组成,其值的范围为0~255,表示256种不同的灰度级。与二值图像相比,灰度图像可以呈现出图像的更多细节信息
- 彩色图像与灰度图像类似,每个像素也会呈现256个灰度级。与灰度图像不同的是,彩色图像每个像素由3个8位灰度值组成,分别对应红、绿、蓝3个颜色通道
1.3.2 图像的基本属性
图像的基本属性包括:
- 图像像素数量:在位图图像的水平和垂直方向上包含的像素数量。单纯增加像素数量并不能提升图像的显示效果,图像的显示效果由像素数量和显示器的分辨率共同决定
- 图像分辨率:指图像在单位打印长度上分布的像素的数量,主要用以表征数字图像信息的密度,它决定了图像的清晰程度。在单位大小面积上,图像的分辨率越高,包含的像素点的数量越多,像素点越密集,数字图像的清晰度也就越高
- 图像大小:图像大小决定了存储图像文件所需的存储空间,一般以字节(B)进行衡量,计算公式为:字节数=(位图高*位图宽*图像深度)/8。从计算公式可以看出,图像文件的存储大小与像素数目直接相关。
- 图像颜色:图像颜色是指数字图像中具有最多数量的可能颜色种类,通过改变红绿蓝三原色的比例,可以非常容易地混合成任意一种颜色。
- 图像深度:又称为图像的位深,是指图像中每个像素点所占的位数。图像的每个像素对应的数据通常可以用1位或多位字节表示,数据深度越深,所需位数越多,对应的颜色表示也就越丰富
- 图像色调:指各种图像颜色对应原色的明暗程度,日常所说的色调的调整也就是对原色明暗程度的调节。色调的范围为0~255,如最简单的灰度图像将色调划分为从白色到黑色的256个色调。RGB图像中则需要对红、绿、蓝三种颜色的明暗程度进行表征,如将红色调加深图像就趋向于深红,绿色调加深图像就趋向于深绿。
- 图像饱和度:表明了图像中颜色的纯度。自然景物照片的饱和度取决于物体反射或投射的特性。在数字图像中处理一般用纯色中混入白光的比例衡量饱和度,纯色中混入的白光越多,饱和度越低,反之饱和度越高。
- 图像亮度:指数字图像中包含色彩的明暗程度,是人眼对物体本身明暗程度的感觉,取值范围一般为0%~100%
- 图像对比度:指的是图像中不同颜色的对比或者明暗程度的对比。对比度越大,颜色之间的亮度差异越大或者黑白差异越大。当对比度增加到极限时,灰度图像就会变成黑白两色图像
- 图像层次:在计算机设计系统中,为更加便捷有效的处理图像素材,通常将它们置于不同的层中,而图像可看作由若干层图像叠加而成。若一个图像有多个图层,则每个图层具有相同的像素、通道数及格式。
1.4 像素间的关系
- 邻域关系:用于描述相邻像素之间的相邻关系,包括4邻域,8邻域,D邻域等类型。其中像素位置$(x,y)$的4邻域是$(x-1, y), (x+1, y), (x, y-1), (x, y+1)$,分别对应像素位置的上、下、左、右4个像素。一般用符号$N4(x, y)$表示像素位置$(x, y)$的4邻域。像素的D邻域又可以称为像素的对角邻域。像素位置$(x, y)$的D邻域为$(x-1, y-1), (x-1, y+1), (x+1, y-1), (x+1, y+1)$。一般使用符号$ND(x, y)$表示位置的D邻域。8邻域为4邻域和D邻域的合集,常用$N_8(x,y)$表示。
- 连通性:是描述区域和边界的重要概念。两个像素联通的必要条件是:两个像素位置满足相邻关系且两个像素的灰度值满足特定的相似性准则。像素间的连通性可分为4连通、8连通和m连通。如果像素q在像素p的4邻域内,则像素p和像素q是4连通的。如果像素q在像素p的8邻域内,则像素p和像素q是8连通的。m联通又称为混合联通,像素p与像素q的m联通需要满足以下两个条件:像素p和像素q具有相同的像素响应值V;像素q在像素p的4邻域内。若像素q在像素p的D邻域内,则要求像素p和像素q的4邻域的交集为空(没有响应值为V的元素)。
- 像素之间的距离:对于像素$p$, $q$和$z$,坐标分别为$(x,y),(s, t)$和$(u, v)$,如果函数D满足距离三要素,即1)非负性,$D(p, q)\geqslant 0$ 2)对称性,$D(p, q)=0$ 3)三角不等式,$D(p, z)\leqslant D(p, q)+D(q, z)$;则称函数D为有效距离函数或度量。常见的像素间距离度量包括: 1) 欧式距离$D_{e}=\sqrt{(x-s)^2+(y-t)^2}$,与像素p欧氏距离小于某一阈值r的像素形成一个以像素p为中心的圆。2)$D_4$距离(城市距离)$D_{e}=\left | x-s \right |+\left | y-t \right |$,与像素p的$D_4$距离小于某一阈值r的像素形成一个以像素p为中心的菱形。3)$D_8$距离(棋盘距离)$D_{8}=max(\left | x-s \right |, \left | y-t \right |)$,与像素p的$D_8$距离小于某一阈值r的像素形成一个以像素p为中心的正方形。
1.5 简单图像处理
数字图像处理的本质是一个多为矩阵。数字图像处理的本质是对多维矩阵的操作。按照处理对象的不同,可将数字图像处理分为黑白图像处理、灰度图像处理、彩色图像处理。按照处理方法进行划分,可将数字图像处理分为空间域处理与频域处理。按照处理策略不同,数字图像处理又分为全局处理与局部处理。数字图像处理一般步骤如图3所示
图3,数字图像处理的一般步骤
1.5.1 图像基本属性的操作
数字图像的基本属性包括亮度、对比度、颜色通道等。这些属性操作都可以通过矩阵操作体现。
- 亮度操作:亮度也称为灰度,它是颜色的明暗变化范围,常用0%~100%(由黑到白)表示。一般数字图像的像素亮度为0~255,可以通过对像素构成矩阵的灰度值进行操作,道道调整图像亮度的目的。图像亮度调节可以采用最简单的图像处理算法,通过常见的线性运算即可完成亮度调节,如所有像素点亮度乘以或者加一个增强系数,使得图像整体变亮或者变暗。
- 对比度操作:对比度指图像暗和亮的落差值,即图像最大灰度级和最小灰度级之间的差值。对于数字图像变换,设原像素灰度为$f(i, j)$,转化后的像素灰度为$g(i, j)$,则常用的线性变换是$g(i, j)=\alpha \times f(i, j) + \beta $,其中系数$\alpha$影响图像的对比度,系数$\beta$影响图像的亮度,具体如下:(1)$\alpha=1$时是原图;(2)$\alpha > 1$时对比度增强,图像看起来更加清晰;(3)$\alpha < 1$时对比度减弱,图像看起来变暗;(4)$\beta$影响图像的亮度,随着增加$\beta(\beta > 0)$和减小$\beta(\beta > 0)$,图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对比度。针对图像亮度、对比度改变如图4图4,对比度调整
- 颜色通道操作:数字图像的本质是一个多维矩阵,如彩色图象是一个三维矩阵,灰度图像和黑白图像由二维矩阵表示。彩色图像一般可分为红、绿、蓝3个颜色通道,每个颜色通道对应一个完整的矩阵
1.5.2 图像的简单运算
图像运算是以图像为单位对图像进行的数学操作,是数字图像信号处理的基础,运算对象以像素点为基本单位,运算结果为一幅灰度分布与原图像不同的新图像。图像的简单运算包括算数运算和逻辑运算。常见的算术运算包括点运算、幂运算、直方图运算等。
1,算术运算和逻辑运算:每次只设计一个空间像素的位置,所以可以“原地”操作。典型的运算包括图像的加法、图像的减法。通过算数运算实现的抠图拼接如图5
图5,通过算数运算实现的图片拼接
2,点运算:点运算只涉及一幅原图像(称为输入图像),运算对象是输入图像像素的灰度值,即输出图像每个像素的灰度值仅取决于输入图像中对应像素的灰度值。点运算具有两个特点:其一,根据某种预先设置的规则,将输入图像各 个像素本身的灰度(和该像素孕育内其他像素的灰度无关)逐一转换成输出图像对应像素的灰度值;其二,点运算不会改变像素的空间位置。因此,点运算也被称为灰度变换。前一小节讲述的亮度及对比度变换属于点运算的范畴。点运算产生的输出图像的每个灰度值仅由对应的输入像素点的值确定,因此点运算不会改变图像内的空间关系。若输入图像为$A(x,y)$,输出图像为$B(x,y)$,则点运算表示为$B(x,y)=TA(x,y)$。
点运算又可以分为线性点运算和非线性点运算。线性点运算的原值和目标值通过线性方程完成转换,典型的如对比度灰度调整、图像反色都属于线性点运算。非线性点运算对应非线性映射函数,典型的映射包括平方函数、对数函数、截取(窗口函数)、阈值函数、多值量化函数等。灰度幂次变换、灰度对数变换、阈值化处理、直方图均衡化是较常见的非线性点运算方法。
幂次变换又称伽马变换,数学形式为$t = c \times s^{\gamma }$,其中$c$和$\gamma$是正常数,$s$代表原图像像素值,$t$表示变换后的像素值。$\gamma < 1$提高灰度级,在正比函数上方,使图像变亮。$\gamma > 1$降低灰度级,在正比函数下方,使图像变暗。当$c=1$时,不同的$\gamma$值对应的幂次变换函数如图6所示
图6,不同的$\gamma$值对应的幂次变换函数
图7, 不同gamma值情况下的幂次变换效果
3, 图像直方图:直方图中的数值都是统计出来的,描述了该图像中关于颜色的数量特征,可以反应颜色的统计分布和基本色调。直方图只包含该图像中某一颜色值出现的频数,而丢失了某像素所在的空间位置信息;任一幅图像都能唯一地给出一幅与它对应的直方图,但不同的图像可能有相同的颜色分布,从而就具有相同的直方图,因此直方图与图像是一对多的关系;如将图像划分为若干个子区域,所有子区域的直方图之和等于全图直方图;一般情况下,由于图像上的背景和前景物体颜色分布明显不同,从而在直方图上会出现双峰特性,但背景和前景颜色较为接近的图像不具有这个特性。颜色直方图又可以分为三类:全局直方图、累加直方图、主色调直方图。
- 全局直方图:反应的是图像中颜色的组成分布,即出现了哪些颜色以及各种颜色出现的概率。其对图像的旋转、平移、缩放和图像质量变化不敏感,比较适用于检索图像的全局颜色相似性,即通过比较颜色直方图的差异衡量两幅图像在颜色全局分布上的差异。
- 累加直方图:当图像中的特征并不能取遍所有可取值时,统计直方图中会出现一些零值。这些零值的出现会对相似性度量的计算带来影响,从而使得相似性度量并不能正确反映图像之间的颜色差别。所以,在全局直方图的基础上使用累加颜色直方图。在累加直方图中,相邻颜色在频数上是相关的。虽然累加直方图的存储量和计算量有很小的增加,但是累加直方图消除了一般直方图中常见的零值,也克服了一般直方图量化过细、过粗检索效果都会下降的缺陷。
- 主色调直方图:因一幅图像中,往往少数几种颜色就涵盖了图像的大多数像素,而且不同颜色在图像中的出现概率是不同的,可以通过统计图像中各种颜色出现的概率选出最频繁出现的ji种颜色作为主色。使用主色并不会降低颜色匹配的效果,因为颜色直方图中出现频率很低的那些颜色往往不是图像的主要内容,从某种程度上讲,是对图像内容表示的一种噪声。
1.5.3 图像卷积操作
图像卷积操作是图像空间域滤波的基础运算,也是当前许多深度特征提取算法的基础。卷积操作就是循环将图像和卷积核逐个元素相乘再求和,结果得到卷积后图像的过程。如图8所示,一幅6*6的图像使用1个3*3的卷积核进行卷积操作,结果得到一个4*4的卷积图像。
图8,图像卷积操作示意
假设卷积核使用K表示,大小为m*n, 原始图像表示为S, 大小为M*N;结果图像表示为T,则卷积操作公式如下:
$T(x, y) = \sum_{i=-a}^{a}\sum_{j=-b}^{b}K(i, j)\times S(x+i, y+j), m=2\times a+1,n=2\times b+1$
卷积操作中,卷积核在原始图像上做到从上到下,从左到右的滑动扫描,每次扫描使用卷积核与其扫描覆盖区域图像做一次卷积运算,然后再移动到下一个位置进行下一次扫描,直到扫描完毕。大部分Python图像处理相关包均将卷积函数集成到其特征提取或滤波模块中,并对卷积操作进行了许多优化。