PCA降维(Opencv,C++)

Posted 朱铭德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCA降维(Opencv,C++)相关的知识,希望对你有一定的参考价值。


//找工作好无趣,还是来写篇博客吧~


为了防止误导,先说一下,PCA降维的作用其实是确定一种从高维映射到低维的关系。PCA名儿叫主成分分析法,顾名思义就是通过加加减减各行得到少于之前的行数来达到计算量降低的效果。


例如在人脸识别中,确定了一个降维矩阵后,每张图片进来都乘以这个矩阵映射到低维的空间来进行计算,无论是分类还是其他啥都会减少很多计算量。


===================下面就开始不正经了=====================


先放一个效果图吧

没错,这个降维效果已经准确把握了降维的精髓了,一语中的找出了图片想表达的内容……



然后放上一波代码

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;


int main() 

	Mat frame = imread("test.jpg");

	cvtColor(frame, frame, CV_RGB2GRAY);
//	double 阈值 = 99.999999999999 / 100.0;
//	PCA pca(frame, Mat(), CV_PCA_DATA_AS_COL, 阈值);
/*
#define CV_PCA_DATA_AS_ROW 0
#define CV_PCA_DATA_AS_COL 1
#define CV_PCA_USE_AVG 2
*/
	int 层数 = 120;
	PCA pca(frame, Mat(), CV_PCA_DATA_AS_COL, 层数);
	//图片大小为400*362
	//这里按COL的方式降维,保证列数不便,行数降低到120层
	//所以可以发现打印的均值的规格为1*362
	cout << "均值的规格:" << pca.mean.size() << endl;//均值
	  cout << "特征值的规格:"<<pca.eigenvalues.size() << endl;//特征值
	  cout <<"特征向量的规格:" <<pca.eigenvectors.size() << endl;//特征向量

	Mat dst = pca.project(frame);//映射新空间
								 //cout << dst;
	Mat src = pca.backProject(dst);//反映射回来
								   //	cout << src;

	imshow("原图", frame);
	imshow("PCA降维后", dst);
	imshow("反映射", src);

	waitKey(-1);

	return 0;


当然,一般来说,PCA降维也没我这么用的,而且一般也没这效果……

(某种程度上可能还有些误导作用,所有还是先看看降维步骤吧)


PCA降维的步骤:


设有m条n维数据。

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值

3)求出协方差矩阵

4)求出协方差矩阵的特征值及对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)PX即为降维到k维后的数据



附上原图




以上是关于PCA降维(Opencv,C++)的主要内容,如果未能解决你的问题,请参考以下文章

opencv实战——PCA算法的应用

LDA和PCA降维总结

吴恩达机器学习-9-降维PCA

特征降维-PCA的数学原理

PCA算法的原理以及c++实现

PCA降维