归一化处理
参考文章:图像归一化
其实我们经常对图像进行的一种预处理方式是归一化处理,
我们这门课是以实战为主,因此部分理论的知识,会点到为止,大量的时间将用于理论与问题的结合上。
图像归一化简介
图像归一化是计算机视觉、模式识别等领域广泛使用的一种技术。所谓图像归一化, 就是通过一系列变换, 将待处理的原始图像转换成相应的唯一标准形式。
归一化的作用
首先要记住,归一化处理不会改变图像的对比度,其次,归一化最直观的理解就是将所有的像素值从原来的[0,255]区间,转化到[0,1]区间。
再者,其作用总的来说是:
- 图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的。(在本场景中主要)
- 避免具有不同物理意义和量纲的输入变量不能平等使用。
- 神经网络中归一化是为了加快训练网络的收敛性或者是归纳统一样本的统计分布性。
图像归一化的几种方式
(1) 线性函数转换,表达式如下:
y=(x-MinValue)/(MaxValue-MinValue)
y=0.1+(x-min)/(max-min)*(0.9-0.1)(归一到0.1-0.9之间)
说明:x、y分别为转换前、后的值,MaxValue、MinValue分别为样本的最大值和最小值。
(2) 对数函数转换,表达式如下:
y=log10(x)
说明:以10为底的对数函数转换。
(3) 反余切函数转换,表达式如下:
y=atan(x)*2/PI
(4) Z-score标准化方法
这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:
y
=
x
−
μ
σ
y = \frac {x - \mu} {\sigma}
y=σx−μ
其中
μ
\mu
μ为所有样本数据的均值,
σ
\sigma
σ为所有样本数据的标准差。
我们主要将线性转换和Z-score转换
首先指出,如果不做二值处理和归一化处理时的分类准确率是:
准确率:0.7138
F1-Score:0.833
线性转换
img_arr = (img_arr - img_arr.min())/(img_arr.max() - img_arr.min())
试验结果是:
准确率:0.8852
F1-Score:0.9391
Z-Score
img_arr = (img_arr - img_arr.mean())/(img_arr.var())
试验结果是:
准确率:0.8569
F1-Score:0.9229
二值化处理
二值化处理,其实是将一个图像的像素点,根据与自定义的阈值的比较,将其转化为1或0。
其实这种方式,是最合理的,因为在手写字体识别过程中,我们并不需要知晓黑色的深浅,只需要知道黑色的部分是否不是黑色。因为不是白色的位置,就意味着是字体的一部分。
而之前提及过,灰度图中白色的像素值是255,黑色是0。
于是代码有:
# 二值处理
for indexi, i in enumerate(img_arr):
for indexj, j in enumerate(i):
if j != 255:
img_arr[indexi][indexj] = 1
else:
img_arr[indexi][indexj] = 0
实验结果是:
准确率:0.9451
F1-Score:0.9718
那么如果两者结合会怎样呢?
-
先执行归一化处理,再执行二值处理。
线性:
准确率:0.1015
F1-Score:0.1843
Z-score:
准确率:0.1015
F1-Score:0.1843 -
先执行二值,再归一。
线性:
准确率:0.9451
F1-Score:0.9718
Z-score:
准确率:0.9451
F1-Score:0.9718
经过上述比较,最终将会使用二值处理在之后的每一次尝试中都会用到。