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

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

  • 特征值分解可以用在主成分分析(PCA)中,当使用opencv对一个矩阵进行了特征值分解后,可以根据分解出的u,w,v矩阵将原矩阵恢复回来。
//@cpp
#include
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);
}

效果图

  • 原始图片

    opencv中SVD分解并恢复重构矩阵_第1张图片

  • 100%还原
    opencv中SVD分解并恢复重构矩阵_第2张图片

  • 20%还原,也就是只取奇异值前百分之二十对应的U和V
    opencv中SVD分解并恢复重构矩阵_第3张图片

  • 只取前15个奇异值对应的U和V
    opencv中SVD分解并恢复重构矩阵_第4张图片

写在后边

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

你可能感兴趣的:(KINECT+Opencv总结)