PCA降维(Opencv,C++)
2017-09-11 20:55
1516 查看
//找工作好无趣,还是来写篇博客吧~
为了防止误导,先说一下,PCA降维的作用其实是确定一种从高维映射到低维的关系。PCA名儿叫主成分分析法,顾名思义就是通过加加减减各行得到少于之前的行数来达到计算量降低的效果。
例如在人脸识别中,确定了一个降维矩阵后,每张图片进来都乘以这个矩阵映射到低维的空间来进行计算,无论是分类还是其他啥都会减少很多计算量。
===================下面就开始不正经了=====================
先放一个效果图吧
没错,这个降维效果已经准确把握了降维的精髓了,一语中的找出了图片想表达的内容……
然后放上一波代码
当然,一般来说,PCA降维也没我这么用的,而且一般也没这效果……
(某种程度上可能还有些误导作用,所有还是先看看降维步骤吧)
PCA降维的步骤:
附上原图
为了防止误导,先说一下,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维后的数据
附上原图
相关文章推荐
- OpenCV中PCA实现人脸降维
- PCA算法学习_1(OpenCV中PCA实现人脸降维)
- PCA算法学习_1(OpenCV中PCA实现人脸降维)
- PCA SVD opencv 降维对比
- OPENCV实现PCA降维中的GENN函数说明
- OpenCV下PCA降维
- opencv中的PCA降维
- opencv笔记(9):特征降维-PCA
- 关于opencv自带的PCA降维我有话要说
- opencv实现PCA人脸降维
- 【转】PCA算法学习_1(OpenCV中PCA实现人脸降维)
- OpenCV下PCA降维
- PCA降维 C++实现
- C++文件目录操作---opencv和boost例子
- OpenCV3_C++_Lines()在图像上画直线 实例
- 数据降维(基于PCA)
- OpenCV3_C++_GaussianBlur()图像高斯模糊化处理 实例
- [置顶] 如何在c++ / opencv 中调用matlab 的图像数据
- OpenCV3_C++_Akaze()图像的特征点提取 实例
- ubuntu 14.04 安装opencv等各种乱七八糟的C++库