图像基础8 图像分类——PCA 图像特征提取算法
2017-07-31 13:12
288 查看
本系列文章 源于《机器学习实践指南 案例应用解析》学习笔记 原书作者:麦好
PCA (Principal Component Analysis),是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。
它可以用于图像矩阵降维,以降维后的矩阵为基础提取图像特征。当提取的图像特征维度比较高时,为了简化计算量以及存储空间,需要对这些高维数据进行一种程度的降维,并尽量保证数据不失真。
此外,PCA算法还可应用于图像矩阵,便于后期识别算法并进一步加工,因为图像特征组含有的不明显的特征值会影响识别的精度。
对于高维的向量,PCA方法求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵民可以叫作变化矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。
通过求样本矩阵的协方差矩阵,然后注出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值大小。
——摘自百度百科
代码示例
下面代码需要安装
代码未测试
PCA (Principal Component Analysis),是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。
它可以用于图像矩阵降维,以降维后的矩阵为基础提取图像特征。当提取的图像特征维度比较高时,为了简化计算量以及存储空间,需要对这些高维数据进行一种程度的降维,并尽量保证数据不失真。
此外,PCA算法还可应用于图像矩阵,便于后期识别算法并进一步加工,因为图像特征组含有的不明显的特征值会影响识别的精度。
对于高维的向量,PCA方法求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵民可以叫作变化矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。
通过求样本矩阵的协方差矩阵,然后注出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值大小。
——摘自百度百科
代码示例
下面代码需要安装
pip install -i https://pypi.douban.com/simple mlpy
# -*- coding: utf-8 -*- import cv2 import numpy as np print(u'正在处理中') w_fg = 20 h_fg = 15 picflag = 3 def readpic(fn): # 返回图像特征码 fnimg = cv2.imread(fn) img = cv2.resize(fnimg,(800,600)) w = img.shape[1] h = img.shape[0] w_interval =int( w/w_fg) h_interval =int( h/h_fg) alltz = [] for now_h in range(0,h,h_interval): for now_w in range(0,w,w_interval): b = img[now_h:now_h + h_interval, now_w:now_w+w_interval,0] g = img[now_h:now_h + h_interval, now_w:now_w+w_interval,1] r = img[now_h:now_h + h_interval, now_w:now_w+w_interval,2] btz = np.mean(b) gtz = np.mean(g) rtz = np.mean(r) alltz.append([btz,gtz,rtz]) result_alltz = np.array(alltz).T pca = mlpy.PCA() pca.learn(result_alltz) result_alltz = pca.transform(result_alltz, k=len(result_alltz)/2) result_alltz = result_alltz.reshape(len(result_alltz)) return result_alltz def get_cossimi(x,y): myx = np.array(x) myy = np.array(y) cos1 = np.sum(myx*myy) cos21 = np.sqrt(sum(myx*myx)) cos22 = np.sqrt(sum(myy*myy)) return cos1/float(cos21*cos22) # x和d样本初始化 train_x = [] d = [] # 读取图像,提取每类图像的特征 # 计算类别特征码,通过每个类别所有样本的区域特征的平均值,提取类别特征 for ii in range(1,picflag+1): smp_x = [] b_tz = np.array([0,0,0]) g_tz = np.array([0,0,0]) r_tz = np.array([0,0,0]) mytz = np.zeros((3,w_fg*h_fg)) for jj in range(1,3): fn = 'p'+str(ii)+'-' + str(jj) + '.png' tmptz = readpic(fn) mytz += np.array(tmptz) mytz /=3 train_x.append(mytz[0].tolist()+mytz[1].tolist() + mytz[2].tolist()) # 计算ptest3的分类 # 计算待分类图像的特征码与每个类别特征码之间的余弦距离,距离最大者为图像所属分类 fn = 'ptest3.png' testtz = np.array(readpic(fn)) simtz = testtz[0].tolist() + testtz[1].tolist() + testtz[2].tolist() maxtz = 0 nowi = 0 for i in range(0,picflag): nowsim = get_cossimi(train_x[i], simtz) if nowsim>maxtz: maxtz = nowsim nowi = i print(u'%s 属于第 %d 类' % (fn,nowi+1)) # 计算ptest1的分类 fn = 'ptest1.png' testtz=np.array(readpic(fn)) simtz = testtz[0].tolist() + testtz[1].tolist() + testtz[2].tolist() maxtz=0 nowi=0 for i in range(0,picflag): nowsim = get_cossimi(train_x[i],simtz) if nowsim>maxtz: maxtz = nowsim nowi = i print(u'%s 属于第 %d 类' % (fn,nowi+1)) # 计算ptest2的分类 fn = 'ptest2.png' testtz = np.array(readpic(fn)) simtz = testtz[0].tolist() + testtz[1].tolist() + testtz[2].tolist() maxtz = 0 nowi = 0 for i in range(0,picflag): nowsim = get_cossimi(train_x[i],simtz) if nowsim>maxtz: maxtz = nowsim nowi = i print(u'%s 属于第%d类' % (fn,nowi+1))
代码未测试
相关文章推荐
- 图像标注 图像分割,特征提取和分类算法
- 图像标注 图像分割,特征提取和分类算法
- 【图像算法】图像特征:三个图像显著性区域特征提取方法
- 图像算法之八:特征提取算法之Haar
- 图像特征提取与匹配之SIFT算法
- 经典算法研究系列:九、图像特征提取与匹配之SIFT算法
- 目标检测的图像特征提取之(四)OpenCV中BLOB特征提取与几何形状分类
- 图像的特征提取算法
- 模式匹配之sift--- sift图像特征提取与匹配算法代码
- 图像处理中,SIFT,FAST,MSER,STAR等特征提取算法的比较与分析(利用openCV实现)
- 基于ORB特征提取算法图像匹配 python实现
- 图像算法之五:特征提取算法之HOG
- 经典算法研究系列:九、图像特征提取与匹配之SIFT算法
- 分类算法之二——特征提取与特征选择
- 图像算法之二:特征提取算法系列之Harris
- 图像特征提取之--PCA方法
- 图像算法之三:特征提取算子之SIFT
- 使用keras预训练VGG16模型参数分类图像并提取特征
- python实现LBP方法提取图像纹理特征实现分类
- 经典算法研究系列:九、图像特征提取与匹配之SIFT算法