图像基础8 图像分类——PCA 图像特征提取算法

编程入门 行业动态 更新时间:2024-10-24 23:24:53

<a href=https://www.elefans.com/category/jswz/34/1771430.html style=图像基础8 图像分类——PCA 图像特征提取算法"/>

图像基础8 图像分类——PCA 图像特征提取算法

本系列文章 源于《机器学习实践指南 案例应用解析》学习笔记 原书作者:麦好

PCA (Principal Component Analysis),是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。
它可以用于图像矩阵降维,以降维后的矩阵为基础提取图像特征。当提取的图像特征维度比较高时,为了简化计算量以及存储空间,需要对这些高维数据进行一种程度的降维,并尽量保证数据不失真。
此外,PCA算法还可应用于图像矩阵,便于后期识别算法并进一步加工,因为图像特征组含有的不明显的特征值会影响识别的精度。
对于高维的向量,PCA方法求得一个k维特征的投影矩阵,这个投影矩阵可以将特征从高维降到低维。投影矩阵民可以叫作变化矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。
通过求样本矩阵的协方差矩阵,然后注出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值大小。
——摘自百度百科

代码示例
下面代码需要安装

pip install -i  mlpy
# -*- coding: utf-8 -*-
import cv2
import numpy as npprint(u'正在处理中')
w_fg = 20
h_fg = 15
picflag = 3def 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).Tpca = 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_alltzdef 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 /=3train_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 = nowsimnowi = 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 = nowsimnowi = 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 = nowsimnowi = i
print(u'%s 属于第%d类' % (fn,nowi+1))

代码未测试

更多推荐

图像基础8 图像分类——PCA 图像特征提取算法

本文发布于:2024-03-12 05:49:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1730826.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:图像   算法   特征   基础   PCA

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!