利用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. Android定位方式和测试方法
  2. VSTS LoadTest使用原则
  3. Python 语法错误:“SyntaxError: invalid character in identifier“,原因及解决方法
  4. 太吾绘卷存档修改2020_太吾绘卷/神级初始存档
  5. Android studio导入support-v4.jar
  6. MVC Html.AntiForgeryToken() 防止CSRF***
  7. 介绍针对企业级Flex开发的开源项目FlexibleShare
  8. 服务器搭建-Linux基础知识
  9. Tensorflow2.0入门教程(一)
  10. 【水】弱化版魔术球问题
  11. 自学Python:批量转换WORD文档为PDF
  12. IDEA中鼠标变成矩形块解决
  13. [中英字幕]吴恩达机器学习系列课程 笔记
  14. 使用visdom三维可视化图像。
  15. Linux服务器键盘鼠标插口,关于Linux下鼠标键盘
  16. mentohust联网报错“系统提示:用户使用了不允许的接入方式!(有线网络请选择“有线1x上网”服务)”
  17. android字体大小根据分辨率自动调整
  18. Oracle 锁表查询
  19. 华硕笔记本BIOS设置u盘启动图文详解
  20. win10更新不支持uefi固件的磁盘布局

热门文章

  1. 发电机计算机控制系统的组成,第一章发动机电控系统概述
  2. linux挂载持有系统镜像光驱
  3. 求职(从一个APP开发的设想看SNS的商业模式)
  4. 山东大学计算机导师东南大学,东南大学和山东大学都是985、211哪所综合实力更强些呢?...
  5. BTS-LovelyFonts
  6. 实习第一天:python
  7. Python 全栈 400 之Pandas数据分析练习
  8. vue文件夹上传源码
  9. 无人机航空摄影测量技术的优势
  10. 车路协同、智能网联方面的英文专业词汇