利用openCV求图片特征值及特征向量

1、运用openCV与c++所涉及的头文件

#include<iostream>
#include<cstring>
#include<highgui.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;//工程所需头文件

2、以灰度形式导入图片

 Mat image;image =imread("C:\\Users\\taekookie\\source\\repos\\图片处理\\图片处理\\任务.jpg",0);//通过绝对路径导入图片imshow("原图", image);//展示原图waitKey(0);destroyAllWindows();

最开始读入图片时选择的是相对路径imread(“任务.jpg"),在代码调试时报错,故而改为了绝对路径。而imshow()函数使用时,需保持独立单一窗口,否则会出现图片显示未响应现象,所以代码中加入了waitKey();与 destroyAllWindows()。

3、将图片像素值矩阵转变为可操作的数据类型

 Mat src;image.convertTo(src, CV_32FC1);

4、通过open CV中的eigen()计算特征值与特征向量

  cv::Mat eValuesMat;//特征值cv::Mat eVectorsMat;//特征向量eigen(src, eValuesMat, eVectorsMat);//通过openCV中eigen函数得到特征值与特征向量

5.1、保留最大的50个特征值对图片进行处理

a、对特征值进行排序

for (int i = 0; i < eValuesMat.rows; i++)//对特征值进行由大到小的排序
{for (int j = 1; j < eValuesMat.rows - i; j++)
{if (eValuesMat.at<float>(i,0) < eValuesMat.at<float>(i + j,0))
{p = eValuesMat.at<float>(i+j, 0);
eValuesMat.at<float>(i, 0) = eValuesMat.at<float>(i + j, 0);
eValuesMat.at<float>(i + j, 0) = p;
}
}
}

b、选取最大的50个特征值

int m=50;Mat Max(eValuesMat.rows, eValuesMat.rows, eValuesMat.type(), Scalar(0));for (int i = 0; i < m; i++){Max.ptr<float>(i)[i] = eValuesMat.ptr<float>(i)[0];//最大的m个特征值组成的对角阵}

c、求解特征向量的逆阵

eVectorsMat = eVectorsMat.t();//eigen函数所得特征向量以行形式存储,故而进行转置后再参与运算
Mat inv;
invert(eVectorsMat, inv);//对特征向量矩阵求逆

由于特征向量是以行形式承载,故先进行转置

d、计算新的矩阵,并以RGB图片形式保存

new_src1 = eVectorsMat * Max * inv;
new_src1.convertTo(new_src1, CV_8UC1);//转换新矩阵数据类型
cvtColor(new_src1, new_src1, CV_GRAY2RGB);//改变图片类型
imwrite("Max.jpg", new_src1);

e、由于openCV中eigen()函数只处理矩阵的上三角部分,所以还需要将src进行转置,处理下三角部分,并使两部分拼接在一起才能真正实现图片完整的处理

Mat img=imread("C:\\Users\\taekookie\\source\\repos\\test\\test\\Max.jpg", 0);
Mat timg = imread("C:\\Users\\taekookie\\source\\repos\\test\\test\\Max1.jpg", 0);
Mat s, ts;
img.convertTo(s, CV_32FC1);
timg.convertTo(s, CV_32FC1);
for (int i = 0; i < 512; i++)//实现上三角部分与下三角部分图片的拼接
{s.at<float>(i, j) = ts.at<float>(i, j);
}
imwrite("finalR.jpg", s);

5.2、随机选取50个特征值对图片进行处理

a、通过srand()函数随机选取50个特征值

unsigned n=50;
srand(n);//通过随机函数取相应数量特征值
int i = 0, j = 0;
while (i = rand() % (eValuesMat.rows) + 1)
{if (j == (eValuesMat.rows - 50))break;
eValuesMat.at<float>(i, 0) = 0;
j++;
}

b、eigen()函数形成的特征值不是对角阵形式,故进行特征值对角化

Mat vals(eValuesMat.rows, eValuesMat.rows, eValuesMat.type(), Scalar(0));//由于eigen函数得到的特征值非对角阵形式,故而将其转换成对角阵形式
float* vals_data = eValuesMat.ptr<float>(0);//通过Mat类自带指针与自定义指针类进行赋值
for (i = 0; i < eValuesMat.rows; i++)
{vals.ptr<float>(i)[i] = vals_data[i];
}

c、计算新矩阵并保存(代码与5.1(d)类似)

d、进行上三角部分与下三角部分的拼接(代码与5.1(e)类似)

6、效果呈现
原图:

选取最大的50个特征值:
a、上三角部分
b、下三角部分


c、拼接后:

随机选取50个特征值:
a、上三角:

b、下三角

c、拼接后

使用openCV与C++求图片特征值及特征向量并进行图片处理相关推荐

  1. 求矩阵特征值和特征向量

    求矩阵特征值和特征向量的一个小程序 代码较长,如果不能执行,就是要建立结构体,大家试试吧,希望能用. // // 实对称三对角阵的全部特征值与特征向量的计算 // // 参数: // 1. doubl ...

  2. QR分解求矩阵特征值、特征向量 C语言

    最近在看一个高光谱图像压缩算法,其中涉及到正交变换,计算正交变换时,需要对普通矩阵求其特征向量.想要在网上找一个现成的程序,可能是我百度的能力不强吧,居然真的没找见.好了废话不多说,下面进入正题. 计 ...

  3. 移位取逆迭代(shifted inverse iteration)求最近特征值和特征向量(python,数值积分)

    第二十七篇 移位取逆迭代求最近特征值和特征向量 移位逆迭代 一种比"最大"特征值法更直接实现向量迭代收敛的的特征值方法是将移位向量迭代法改写为下面形式 其中p是一个标量" ...

  4. python求矩阵特征值和特征向量_特征值,特征向量,标准正交向量组与numpy

    使用python的数值计算库numpy来计算矩阵的特征值,特征向量与标准正交向量组 import numpy as np 1.求矩阵 的特征值和各特征值所对应的特征向量 x = np.array([[ ...

  5. MATLAB中求矩阵特征值和特征向量

    格式:[X,B]=eig(A) %求矩阵A的特征值和特征向量,其中B的对角线元素是特征值 eg: 特征值0.8105对应的特征向量是[0.3365 -0.9417]: 特征值21.2895对应的特征向 ...

  6. 幂乘法求最大特征值和特征向量

    1. 理论解释 则x为A的特征向量,λ为特征值. 特征向量具有非相关性,因此可以作为一组基.即对任意的向量b,可以表示为 对于半正定矩阵,假设特征值 对b左乘矩阵A可得, 进行K次左乘A 因此, No ...

  7. matlab求矩阵特征值和特征向量、行列式

    如果A为方阵,满足AX=λX的λ称为A的特征值,X称为A的特征向量. 计算A的特征值用eig(A). 例:A=[1 2 3;4 5 6;7  8 9]; Z=eig(A) Z =    16.1168 ...

  8. MATLAB求最大特征值和特征向量

    若已知矩阵为A,则[V,D]=eig(A),其中对角阵D的对角元素为A的特征值,而矩阵D的每一列向量为其所对应的特征向量. A = 0.3132    0.3566    0.2545    0.25 ...

  9. Jacobi迭代求矩阵特征值和特征向量+C代码

    Jacobi计算过程如下: 1. 选择矩阵A非对角元中最大值A[i][j],运用公式 tan 2O = 2*A[i][j] / (A[i][i] -A[j][j]) 获得选择平面矩阵J,使J * A  ...

最新文章

  1. Oracle根据已有表的数据建立新表
  2. MySQL绿色版5.7以上安装教程
  3. 如何快速找到最优路线?深入理解游戏中寻路算法
  4. 和我一起开发Android应用(二)——“悦词-i背单词”项目功能分析
  5. jsonp使用,spring4.x对jsonp的支持
  6. C++ STL容器在for循环中删除迭代器 正确方法 it++正确吗
  7. 第三章 授权——《跟我学Shiro》[张开涛]
  8. Win10锁屏壁纸获取
  9. 自己用命令强制删除占用的文件或文件夹
  10. BF模式匹配算法!字符串的模式匹配。
  11. 河北科技师范学院对口计算机分数线,河北科技师范学院对口分数线
  12. 计算机mac地址和另一台一样,电脑mac地址有多个怎么办
  13. 2022-2028全球及中国弹性体行业研究及十四五规划分析报告
  14. 网贷之家 python 爬取公开的平台数据
  15. JS:offsetParent屬性
  16. 对spring boot yml配置文件敏感信息加密处理的两种方式
  17. WWDC15 iOS游戏开发3个新框架全解
  18. Android如何安全替换证书
  19. 超易懂!贝叶斯分类器原理
  20. gis data editor.php,我们的漏洞Webug 3.0中级进阶攻略(上)

热门文章

  1. redis java 队列_Redis 队列 Java调用简单实现
  2. 【论文笔记】基于动作空间划分的MAXQ自动分层方法
  3. 必须有公网IP吗?内网穿透如何实现外网访问
  4. Referrer策略
  5. 智慧扫码点餐系统源码
  6. jQuery实现类似淘宝轮播图
  7. 金三银四!软件测试面试谈薪资的7个技巧
  8. 45套(毕业答辩、开题报告、职场)PPT模板免费赠送
  9. 分布式系统之远程过程调用(RPC)精讲
  10. [机缘参悟-46]:鬼谷子-第十谋篇-谋者,智慧之意也