opencv-SVD奇异值分解

资料:https://blog.csdn.net/u012198575/article/details/99548136  

 

实例一:压缩图像

复制代码
#include<opencv2/opencv.hpp>
#include<iostream>



int main(int argc, char** argv) {

    cv::Mat src = cv::imread("D:/bb/tu/lm.jpg", 0);
    //src是m行n列

    cv::Mat result;
    cv::Mat tempt;
    cv::Mat U, S, V;
    src.convertTo(tempt, CV_32FC1);
    cv::SVD::compute(tempt, S, U, V);//SVD分解
    // S是n行1列(CV_32F),U是m行n列(CV_32F),V是n行n列(CV_32F)
    
    cv::Mat s = cv::Mat::zeros(cv::Size(S.rows, S.rows), CV_32FC1);
    double theratio = 0.1;//压缩比例--数值越小,压缩越厉害
    int len = theratio * S.rows;
    for (int i = 0; i < len; ++i) s.ptr<float>(i)[i] = S.ptr<float>(i)[0];

    result = U * s * V; //压缩后还原

    cv::Mat outputImg;  //压缩后的图像
    result.convertTo(outputImg, CV_8UC1);
        
    cv::imshow("原图", src);
    cv::imshow("压缩后", outputImg);

    cv::waitKey(0);
    return 0;
}
复制代码

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(247)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-11-24 Arduino--防撞模块
点击右上角即可分享
微信分享提示

目录导航