9. KNN和Sparse构图

一、前言

图是一种重要的数据结构,本文主要表示图像的无向图。所谓无向图是指,图的节点间通过没有方向的边连接。

无向图的表示:

无向图G=<V,E>,其中:

1.V是非空集合,称为顶点集。

2.E是V中元素构成的无序二元组的集合,称为边集。

对于图像来说,每一个像素都可以看做是一个节点,根据具体节点连接选择方式的不同,可以分为KNN构图和Sparse构图等等。

所谓KNN构图是指,每个像素的节点都与图像中与改点距离最小的K个点连接,连接的值可以通过最小二乘重构计算。

Sparse构图也是一样,主要是将每个像素在其余像素构成的字典中位置原子连接。具体算法可以参考相关文献。

二、实现

本节主要实现单个点的图连接情况。稀疏构图采用的是OMP算法解算的。

主要代码函数如下:

 1 void SparseGraphic::KNNSparseGraphics(const QString fileName, const QPoint curPos,
 2                                       const int K, QVector<QPoint> &resPoint, const int flag)
 3 {
 4     if(curPos.x()<0 || curPos.y()<0)
 5         return;
 6     cv::Mat Img = GDALOpenCV::GDAL2Mat(fileName);
 7     int row = Img.rows;
 8     int col = Img.cols;
 9     if(curPos.x()>=col || curPos.y() >= row)
10         return;
11     if(flag != 0 && flag != 1)
12         return;
13     cv::Mat imgVec = Img.reshape(1,row*col);
14     cv::transpose(imgVec,imgVec);
15     int curPosVec = curPos.y()*col + curPos.x();
16     cv::Mat Dict;
17     if(curPosVec != 0)
18     {
19         cv::Mat Dict1 = imgVec.colRange(0,curPosVec-1);
20         cv::Mat Dict1_T = Dict1.t();
21         cv::Mat Dict2 = imgVec.colRange(curPosVec,imgVec.cols);
22         cv::Mat Dict2_T = Dict2.t();
23         Dict1_T.push_back(Dict2_T);
24         cv::Mat Dict_T = Dict1_T.clone();
25         Dict = Dict_T.t();
26         Dict = Dict.clone();
27         Dict1.release();
28         Dict2.release();
29         Dict_T.release();
30         Dict1_T.release();
31         Dict2_T.release();
32     }else
33     {
34         cv::Mat Dict1 = imgVec.colRange(1,imgVec.cols);
35         Dict = Dict1.clone();
36         Dict1.release();
37     }
38     cv::Mat curPosImgVec = imgVec.colRange(curPosVec-1,curPosVec);
39     QVector<int> index;
40     for(int i = 0;i<row*col;i++)
41         index.push_back(i);
42     index.removeAt(curPosVec);
43
44     if(flag == 0)
45     {
46         cv::Mat tmpCurPosImgVec = cv::repeat(curPosImgVec,1,Dict.cols);
47         cv::Mat subMat = Dict - tmpCurPosImgVec;
48         subMat = subMat.mul(subMat);
49         cv::sqrt(subMat,subMat);
50         cv::reduce(subMat,subMat,0,CV_REDUCE_SUM);
51         QuickSort(subMat,index,0,row*col-2);
52         for(int i = 0;i<K;i++)
53         {
54             int r = index[i]/col;
55             int c = index[i]%col;
56             QPoint mPos;
57             mPos.setX(c);
58             mPos.setY(r);
59             resPoint.push_back(mPos);
60         }
61     }else
62     {
63         QVector<int> tmpIndex;
64         cv::Mat A = ormpSparseRepresentation::ompSparseL2(Dict,curPosImgVec,tmpIndex,K);
65         for(int i = 0;i<K;i++)
66         {
67             int r = index[tmpIndex[i]]/col;
68             int c = index[tmpIndex[i]]%col;
69             QPoint mPos;
70             mPos.setX(c);
71             mPos.setY(r);
72             resPoint.push_back(mPos);
73         }
74     }
75 }

其中:排序与omp算法的代码见文档8和文档7

三、显示

时间: 2024-10-17 16:48:09

9. KNN和Sparse构图的相关文章

基于稀疏矩阵的k近邻(KNN)实现

一.概述 这里我们先来看看当我们的数据是稀疏时,如何用稀疏矩阵的特性为KNN算法加速.KNN算法在之前的博文中有提到,当时写的测试程序是针对稠密矩阵数据的.但实际上我们也会遇到不少的稀疏数据,而且有很多是有意而为之的,因为稀疏数据具有稠密数据无法媲美的存储和计算特性,这对工程应用中的内存需求和实时需求是很重要的.所以这里我们也来关注下稀疏矩阵的存储和其在knn算法中的应用举例. 大家都知道,所谓稀疏矩阵,就是很多元素为零的矩阵,或者说矩阵中非零元素的个数远远小于矩阵元素的总数,如上图.如果我们只

【机器学习实战】第2章 K-近邻算法(k-NearestNeighbor,KNN)

第2章 k-近邻算法 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script> KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法主要是用来进行分类的. KNN 场景 电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢? 动作片:打斗次数更多 爱情片

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

k最邻近算法——加权kNN

加权kNN 上篇文章中提到为每个点的距离增加一个权重,使得距离近的点可以得到更大的权重,在此描述如何加权. 反函数 该方法最简单的形式是返回距离的倒数,比如距离d,权重1/d.有时候,完全一样或非常接近的商品权重会很大甚至无穷大.基于这样的原因,在距离求倒数时,在距离上加一个常量: weight = 1 / (distance + const) 这种方法的潜在问题是,它为近邻分配很大的权重,稍远一点的会衰减的很快.虽然这种情况是我们希望的,但有时候也会使算法对噪声数据变得更加敏感. 高斯函数 高

KNN分类算法实现手写数字识别

需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ?数据维度比较大,样本数比较多. ? 数据集包括数字0-9的手写体. ?每个数字大约有200个样本. ?每个样本保持在一个txt文件中. ?手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下: 数据集压缩包解压后有两个目录:(将这两个目录文件夹拷贝的项目路径下E:/KNNCase/digits/) ?目录trainingD

常用机器学习算法KNN原理与实践

推荐两篇讲解与实践KNN比较好博客,感谢原作者总结 http://blog.csdn.net/u012162613/article/details/41768407 http://www.cnblogs.com/ybjourney/p/4702562.html

LoadRunner相关架构图

LoadRunner概览图: Lr架构图:

k近邻(KNN)复习总结

摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类别,通过多数表决等方式进行预测:k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的"模型".(Cover和Hart 在1968)--参考自<统计学习方法> 2.算法推导 2.1 kNN三要素 k值的选择:当k值较小时,预测结果对近邻的实例点非常敏感,容易发生过拟

关于KNN的python3实现

关于KNN,有幸看到这篇文章,写的很好,这里就不在赘述.直接贴上代码了,有小的改动.(原来是python2版本的,这里改为python3的,主要就是print) 环境:win7 32bit + spyder + anaconda3.5 一.初阶 # -*- coding: utf-8 -*- """ Created on Sun Nov 6 16:09:00 2016 @author: Administrator """ #Input: # ne