您的位置:首页 > 运维架构

opencv中SVD分解并恢复重构矩阵

2016-05-16 23:55 696 查看

opencv中SVD分解并恢复重构矩阵

特征值分解可以用在主成分分析(PCA)中,当使用opencv对一个矩阵进行了特征值分解后,可以根据分解出的u,w,v矩阵将原矩阵恢复回来。

//@cpp
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("image.jpg", 0);//以灰度图打开一张360X480的image.jpg
Mat temp(image.size(), CV_32FC1, Scalar(0));
image.convertTo(image, CV_32FC1);
Mat U, W, V;
SVD::compute(image, W, U, V);//opencv得到的V与MATLAB相比已经经过转置了,要想再转置一遍可以用V=V.t();
image.convertTo(image, CV_8UC1);
imshow("0", image);
Mat w(360, 360, CV_32FC1, Scalar(0));//opencv进行SVD分解后得到的奇异值不是放入对角矩阵,而是一个列向量中,所以需要自己将其变换为对角矩阵
for (int i = 0;i < 10;i++)
w.ptr<float>(i)[i] = W.ptr<float>(i)[0];
temp = U*w*V;
temp.convertTo(temp, CV_8UC1);
imshow("1", temp);
waitKey(6000);
}


效果图

原始图片



100%还原



20%还原,也就是只取奇异值前百分之二十对应的U和V



只取前15个奇异值对应的U和V



写在后边

继5月14日博文。上周的课题还没有做到满意的地步,对视频的监控虽然写出框架和初步的匹配了,但是精度不够高,仔细想了想应该是数据挖掘方面的知识不够,于是今天看了看特征值、奇异值、协方差,发现大一时候学的全都还给了老师。现在重新结合实际才发现这些概念的应用空间还是很大。下一步我会把视频监控识别的匹配算法部分再考虑一下,用奇异值分解的方法将数据矩阵降维后匹配。另外奇异值相关的理解我是看了知乎(奇异值的物理意义是什么?)一文后深刻理解的,希望大家能前去学习一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: