图像处理之PCA(C++)

图像处理之PCA(C++)


文章目录

  • 图像处理之PCA(C++)
  • 前言
  • 一、PCA原理
    • 1.原理思想
    • 2.实现步骤
  • 二、代码实现
  • 总结


前言

在科研、工程应用中,我们往往所获取的数据都包含着很多冗余的信息,这些冗余的信息会对我们分析数据造成干扰。因此,我们可以采用PCA(主成分分析法)去除冗余信息,抓住主要特征,减少数据量。


一、PCA原理

1.原理思想

PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。
主要的应用是:数据压缩(降维)、可视化高维特征、缓解维度灾难、特征独立、降噪、计算物体的方向

2.实现步骤

假设m条n维数据。(使用PCA主成分分析得到的结果就是得到降维后的m条k维数据)

  1. 将原始数据按列组成n行m列矩阵X0(n*m)
  2. 将矩阵X0的每一行进行零均值化,得到矩阵X(n*m),即减去这一行的均值
  3. 求出协方差矩阵C(n*n)(m为矩阵X0的列数)
    协方差矩阵
  4. 求出协方差矩阵的特征值及其对应的特征向量。得到n个特征值,对应n个特征向量,其中每个特征向量的长度又为n,也即所有特征向量组成n行n列的矩阵。
  5. 将特征向量按照特征值从大到小的顺序从上到下排列成矩阵,取前k行组成矩阵P(k*n)
  6. 根据Y=PX即可获得降维到k维后的数据矩阵Y(k*m)

二、代码实现

#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;/*
* @param cv::Mat src 输入图像
* @param cv::Mat pca 输出图像
* @param int	k	 降维后的维度
* @brief pca主成分分析法降维
*/
void do_pca(cv::Mat src,cv::Mat& pca,int k)
{if (src.rows <= 1 || src.cols <= 1){return;}k = k > src.rows ? src.rows : k;		//取src.rows和k的较小值int h = src.rows;int w = src.cols;// 1.求每一行的平均值std::vector<float> meanVec(src.rows,0);for (int i = 0; i < h; i++){for (int j = 0; j < w; j++){meanVec[i] += src.at<uchar>(i, j);}meanVec[i] /= w;}// 2.去平均处理src.convertTo(src, CV_32F);for (int i = 0; i < h; i++){for (int j = 0; j < w; j++){src.at<float>(i, j) -= meanVec[i];}}// 3.计算协方差矩阵cv::Mat covMat;covMat = src * src.t()/w;// 4\5.求出协方差矩阵的特征值和对应的特征向量cv::Mat eigenValues;	//特征值cv::Mat eigenVectors;	//特征值对应的特征向量cv::eigen(covMat, eigenValues, eigenVectors);	//cv::eigen()输入必须是CV_32F或者CV_64F类型的对称矩阵,//且该函数输出的eigenValues和eigenVectors已经按照从大到小的顺序排列// 5.取前k行的矩阵Pcv::Mat kMat;eigenVectors(cv::Rect(0, 0, eigenVectors.cols, k)).copyTo(kMat);// 6.获得降维后的矩阵Ycv::Mat yMat;yMat = kMat * src;pca = yMat.clone();		//数据类型CV_32FC1
}int main()
{string path = "F://work_study//algorithm_demo//";cv::Mat src = cv::imread(path + "baby.jpg", cv::IMREAD_GRAYSCALE);if (src.empty())return -1;//自己实现的pcacv::Mat pca_dst;int k = 100;	//降维后维度do_pca(src, pca_dst, k);//opencv实现的pcacv::PCA pca(src, Mat(), PCA::DATA_AS_COL, k);cv::Mat dst = pca.project(src);imshow("pca", pca_dst);imshow("opencv_pca", dst);cv::waitKey(0);return 0;
}

原图
自己实现的pca
自己实现的pca
opencv实现的pca
opencv实现的pca


总结

本文使用C++借助opencv实现了pca算法,介绍了pca原理、计算过程以及源代码的实现,主要核心是利用opencv中的cv::eigen()对协方差矩阵进行特征值和特征向量的计算,欢迎大家提出问题。
本文代码均已经在本地运行成功,欢迎阅读交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3015652.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

卷价格不如卷工艺降本增效狠抓模块规范化设计

俗话说&#xff0c;“卷价格不如卷工艺”&#xff0c;这意味着在追求成本控制和效率提升的过程中&#xff0c;蓝鹏的领导认为蓝鹏应该更注重工艺的优化和创新&#xff0c;而不仅仅是价格的竞争。而模块规范化设计正是实现这一目标的有效途径。 模块规范化设计可以提高生产效率…

【超好用的前端表单辅助功能】

前端表单辅助功能 1. 根据模块自动生成目录锚点定位2. 描点定位动态组件3. 隔离组件&#xff0c;组件内部实现校验逻辑&#xff0c;交给提交按钮统一处理4. 选择不同的类型需要重组不同的模块展示&#xff0c;并整合数据传给后端 最近做了一个复杂的表单&#xff0c;涉及到的技…

深入Django:用户认证与权限控制实战指南

title: 深入Django&#xff1a;用户认证与权限控制实战指南 date: 2024/5/7 18:50:33 updated: 2024/5/7 18:50:33 categories: 后端开发 tags: AuthDecoratorsPermissionsGuardianRESTAuthSessionMgmtMFA 第1章&#xff1a;入门Django与设置 1.1 Django安装与环境配置 在…

3399 ubuntu系统启动后,gpio已被初始化问题查找

问题描述: 使用cat /sys/kernel/debug/gpio后发现,gpio-55已经被设备树初始化了。 如果要找到这个引脚的设置代码,需要一点点查找。这里记录了比较快速的办法 gpio引脚变换 gpio-55需要转换成对应的引脚编号 根据https://blog.csdn.net/ch122633/article/details/120233…

超详细——集成学习——Adaboost实现多分类——附代码

资料参考 1.【集成学习】boosting与bagging_哔哩哔哩_bilibili 集成学习——boosting与bagging 强学习器&#xff1a;效果好&#xff0c;模型复杂 弱学习器&#xff1a;效果不是很好&#xff0c;模型简单 优点 集成学习通过将多个学习器进行结合&#xff0c;常可获得比单一…

4.请求体

什么是请求体(Request Body) 请求体是客户端发送到API的数据。 响应体是API发送给客户端的数据 API几乎总是必须发送一个响应体&#xff0c;但是客户端并不需要一直发送请求体 定义请求体&#xff0c;需要使用 Pydantic 模型 不能通过GET请求发送请求体发送请求体数据&…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置&#xff0c;然后在project的build.gradle.kts中使用如下方式引入&#xff1a; apply(from "./config.gradle") 缺点&#xff1a;在project的module中引用无任何提示&#xff0c;无法跳转到指定引用 一、创建versio…

局域网监控软件能干什么|有哪些好用的局域网监控软件

企业局域网已成为日常工作中不可或缺的一部分。 然而&#xff0c;网络环境的复杂性和员工上网行为的多样性&#xff0c;使得企业面临着诸多安全风险和管理挑战。 因此&#xff0c;高效局域网监控上网记录监测成为了企业保障信息安全和提升工作效率的重要手段。 高效局域网监控…

Java 框架安全:Struts2 漏洞序列测试.

什么是 Struts2 框架 Struts 2 是一个用于创建企业级 Java 应用程序的开源框架。它是一个 MVC&#xff08;模型-视图-控制器&#xff09;框架&#xff0c;用于开发基于 Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;的 Web 应用程序。Struts 2 主要解决…

STM32控制DS1302时钟模块获取实时时间

欢迎入群共同学习交流 时间记录&#xff1a;2024/4/30 一、知识点 &#xff08;1&#xff09;读写数据时序&#xff08;伪SPI协议&#xff09; 1.1 读写时序默认电平均为SCLK线低电平&#xff0c;CE线低电平 1.2 写数据&#xff0c;CE线拉高为高电平&#xff0c;开始传输数据…

CANoe测试报告格式转换

CANoe测试报告使用工具Vector CANoe Test Report Viewer进行格式转换 一、 Test Report Viewer format转换为PDF格式 使用工具Vector CANoe Test Report Viewer打开*.vtestreport文件,点击File | Export | Export PDF,可以将测试报告转为PDF格式。 二、Test Report Viewe…

想做视频号小店,为何不建议开通个体店?开店步骤+做店思路如下

我是王路飞。 如果你想在视频号开通店铺的话&#xff0c;那么一定不要使用个体执照开通个体店&#xff1f; 这是为什么呢&#xff1f; 原因很简单&#xff0c;视频号个体店是无法入驻优选联盟的&#xff0c;只能企业店可以入驻。 因为现阶段视频号小店的自然流量很少&#…

18、ESP32 ESP-NOW 点对点通信

ESP-NOW 是乐鑫自主研发的无连接通信协议&#xff0c;具有短数据包传输功能。该协议使多个设备能够以简单的方式相互通信。 ESP-NOW 功能 ESP-NOW 支持以下功能&#xff1a; 加密和未加密的单播通信;混合加密和未加密的对等设备;最多可携带 250 字节 的有效载荷;发送回调功能…

C 语言文件输入/输出(I/O)函数大全

C 语言文件输入/输出&#xff08;I/O&#xff09;函数大全 1. fopen() 函数2. fclose() 函数3. fread() 函数4. fwrite() 函数5. fseek() 函数6. ftell() 函数7. rewind() 函数8. feof() 函数9. ferror() 函数10. clearerr() 函数 &#x1f60a; C 语言文件输入/输出&#xf…

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今&#xff0c;视频问诊小程序作为医疗服务的一种新形式&#xff0c;正逐渐受到人们的关注和青睐。今天&#xff0c;小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础&#xff0c;它提供了一套完整的医疗服务系统框架&…

shpfile转GeoJSON;控制shp转GeoJSON的精度;如何获取GeoJSON;GeoJSON是什么有什么用;GeoJSON结构详解(带数据示例)

目录 一、GeoJSON是什么 二、GeoJSON的结构组成 2.1、点&#xff08;Point&#xff09;数据示例 2.2、线&#xff08;LineString&#xff09;数据示例 2.3、面&#xff08;Polygon&#xff09;数据示例 2.4、特征&#xff08;Feature&#xff09;数据示例 2.5、特征集合&…

谷歌推广和seo收录是一回事吗?

那自然不是一回事&#xff0c;谷歌推广一般指的是谷歌的广告服务&#xff0c;通过购买广告位&#xff0c;以便用户在谷歌搜索特定关键词时显示您的广告&#xff0c;这种方式通常基于点击收费&#xff0c;意味着您只有在有人点击您的广告时才需要支付费用。谷歌推广可以让您的网…

【系统分析师】系统分析部分

文章目录 1、系统分析概述2、详细调查2.1 为什么要做详细调查&#xff1f;2.2 详细调查的原则2.3 详细调查的内容2.4 详细调查的方法 3、现有系统分析3.1 获得系统的物理模型3.2 抽象出现有系统的逻辑模型3.3 建立新系统的逻辑模型3.4 建立新系统的物理模型 4、组织结构分析4.1…

如何选择适合的美国站群服务器:经济实惠而可靠的选择

如何选择适合的美国站群服务器&#xff1a;经济实惠而可靠的选择 在今天的数字化时代&#xff0c;选择适合的服务器对于个人网站或企业来说至关重要。一台性能稳定、价格实惠的美国站群服务器能够为您的网站提供所需的支持&#xff0c;但在选择之前&#xff0c;有一些关键因素…

项目计划书(Word原件)

项目开发计划包括项目描述、项目组织、成本预算、人力资源估算、设备资源计划、沟通计划、采购计划、风险计划、项目过程定义及项目的进度安排和里程碑、质量计划、数据管理计划、度量和分析计划、监控计划和培训计划等。 软件资料清单列表部分文档&#xff1a; 工作安排任务书…