1.前言
这里是使用“特征提取+BP神经网络,实现对图像的分类”,需要知道的是:1.对二维图像做完标签,制作数据集后,可以用CNN(一般输入是而惟独图片)来对图像做分类的。当前,在这之前要经过对模型的训练过程。2.也可以通过特征提取先把二维图片变成一位特征,输入到BP神经网络中,进行模型训练,然后做分类。
今天,讲到的,就是第2种方式。
2.数据集制作
这里使用的是对工业金属件表面缺陷图像(有三类缺陷图像,分别是:裂纹crack,夹杂inclusion,麻点pitted )。
使用Hu不变矩等方法手动提取特征(一维特征),然后输入BP神经网络中做分类。
首先,使用Hu不变矩对缺陷图像进行特征提取,每一副缺陷图像产生7个特征,再加上这副图像的类别标签,就形成了数据集中的一个样本。
我们选取了夹杂、裂纹和麻点三类缺陷各100副图像,制作数据集。使用Hu不变矩进行特征提取后,就有了300个样本的特征。
Hu矩特征提取的代码(opencv+python)
def sys_moments(img):
'''
opencv_python自带求矩以及不变矩的函数
:param img: 灰度图像,对于二值图像来说就只有两个灰度0和255
:return: 返回以10为底对数化后的hu不变矩
'''
moments = cv2.moments(img) # 返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)
humoments = cv2.HuMoments(moments) # 根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩
# 因为直接计算出来的矩可能很小或者很大,因此取对数好比较,这里的对数底数为e,通过对数除法的性质将其转换为以10为底的对数
humoment = (np.log(np.abs(humoments))) / np.log(10)
return humoment
def def_moments(img_gray):
'''
自定义求矩函数,主要是根据公式将一个个参数求出
:param img_gray: 灰度图像,对于二值图像来说就只有两个灰度0和255
:return: 返回以10为底对数化后的hu不变矩
'''
'''
由于7个不变矩的变化范围很大,为了便于比较,可利用取对数的方法进行数据压缩;
同时考虑到不变矩有可能出现负值的情况,因此,在取对数之前先取绝对值
经修正后的不变矩特征具有平移 、旋转和比例不变性
'''
# 标准矩定义为m_pq = sumsum(x^p * y^q * f(x, y))其中f(x,y)为像素点处的灰度值
row, col = img_gray.shape
# 计算图像的0阶几何矩
m00 = img_gray.sum()
##初始化一到三阶几何矩
# 计算一阶矩阵
m10 = m01 = 0
# 计算图像的二阶、三阶几何矩
m11 = m20 = m02 = m12 = m21 = m30 = m03 = 0
for i in range(row):
m10 += (i * img_gray[i]).sum() # sum表示将一行的灰度值进行相加
m20 += (i ** 2 * img_gray[i]).sum()
m30 += (i ** 3 * img_gray[i]).sum()
for j in range(col):
m11 += i * j * img_gray[i][j]
m12 += i * j ** 2 * img_gray[i][j]
m21 += i ** 2 * j * img_gray[i][j]
for j in range(col):
m01 += (j * img_gray