;第13章;13.1案例背景;本案例的主要目标包括掌握使用PIL包读取图像并进行简单处理的方法、掌握图像的颜色特征提取及计算方法,掌握基于支持向量机的水色图像分类识别模型和基于卷积神经网络的水色图像分类识别模型。基本的实现思路如图13-1所示。
;;最后,利用PIL包和matplotlib绘图包可以进行图片的读取、处理及显示。下面以文件夹下第1张图片为例,介绍图片的读取、更改大小、获取RGB通道数据、灰度处理、图片显示等基本知识。示例代码如下:
;13.4支持向量机分类识别模型;图像的特征很多,主要包括颜色、纹理、形状和空间关系等。与其他特征相比,颜色特征更为稳健且不敏感,具有较强的鲁棒性。这里主要介绍图片的颜色特征,包括R、G、B3个通道的一阶、二阶、三阶矩。
;根据13.4.1小节关于颜色矩的定义和计算公式,本小节计算每张图片的R、G、B三个颜色通道的一阶、二阶、三阶颜色矩,共9个特征指标构造自变量X。其中在计算X的时候,为了统一图像大小及获得具有代表性的像素矩阵,取图像中心点100像素×100像素的矩阵进行计算,同时对像素值进行了标准化处理,即归一化。另外通过图片文件命名规律,截取每个图片的类别编号即可构造因变量Y。示例代码如下:
;R=R[row_1:row_2,con_1:con_2] #R通道中心点100×100像素
G=np.array(im[1])/255 #G通道
G=G[row_1:row_2,con_1:con_2] #G通道中心点100×100像素
B=np.array(im[2])/255 #B通道
B=B[row_1:row_2,con_1:con_2] #B通道中心点100×100像素
#R,G,B一阶颜色矩
r1=np.mean(R)
g1=np.mean(G)
b1=np.mean(B)
#R,G,B二阶颜色矩
r2=np.std(R)
g2=np.std(G)
b2=np.std(B)
a=np.mean(abs(R-R.mean())**3)
b=np.mean(abs(G-G.mean())**3)
c=np.mean(abs(B-B.mean())**3)
#R,G,B三阶颜色矩
r3=a**(1./3)
g3=b**(1./3)
b3=c**(1./3);#赋给预定义的自变量X
X[i,0]=r1
X[i,1]=g1
X[i,2]=b1
X[i,3]=r2
X[i,4]=g2
X[i,5]=b2
X[i,6]=r3
X[i,7]=g3
X[i,8]=b3
;基于13.4.2小节计算得到的自变量(X)与因变量(Y)数据,按照80%训练、20%测试,构建训练数据集和测试数据集,并利用支持向量机分类识??模型进行训练与预测,并计算预测准确率,示例代码如下:
#按80%训练,20%测试,构建训练数据集和测试数据集
fromsklearn.model_selectionimporttrain_test_split
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2,random_state=4)
fromsklearn.svmimportSVC
clf=SVC(class_weight=balanced)#类标签平衡策略
clf.fit(x_train,y_train)
y1=clf.predict(x_test)#对测试数据进行预测,并获得预测结果
r=y1-y_test#预测值与真实值相减
v=len(r[r==0])/len(y1)#预测值与真实值相减为0,即预测准确,统计其准确率
print(预测准确率:,v)
执行结果如下:
预测准确率:0.21951219512195122
从预测结果可以看出,利用支持向量机分类识别模型对水色类型识别准确率仅为21.95%,远远达不到应用的需求。是我们的特征计算出错了呢?还是特征指标数据本身区分度就很低呢?通过分析我们发现,特征指标数据归一化后其取值范围在0~1,同时确实存在特征指标数据之间区分度较低的情形,如果直接输入支持向量机分类识别模型也会造成彼此之间区分度低,从而造成预测准确率较低。
;