一、前言

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

无向图的表示:

无向图G=<V,E>,其中:
1.V是非空集合,称为顶点集。
2.E是V中元素构成的无序二元组的集合,称为边集。
对于图像来说,每一个像素都可以看做是一个节点,根据具体节点连接选择方式的不同,可以分为KNN构图和Sparse构图等等。
所谓KNN构图是指,每个像素的节点都与图像中与改点距离最小的K个点连接,连接的值可以通过最小二乘重构计算。
Sparse构图也是一样,主要是将每个像素在其余像素构成的字典中位置原子连接。具体算法可以参考相关文献。
 
二、实现
本节主要实现单个点的图连接情况。稀疏构图采用的是OMP算法解算的。
主要代码函数如下:
 void SparseGraphic::KNNSparseGraphics(const QString fileName, const QPoint curPos,
const int K, QVector<QPoint> &resPoint, const int flag)
{
if(curPos.x()< || curPos.y()<)
return;
cv::Mat Img = GDALOpenCV::GDAL2Mat(fileName);
int row = Img.rows;
int col = Img.cols;
if(curPos.x()>=col || curPos.y() >= row)
return;
if(flag != && flag != )
return;
cv::Mat imgVec = Img.reshape(,row*col);
cv::transpose(imgVec,imgVec);
int curPosVec = curPos.y()*col + curPos.x();
cv::Mat Dict;
if(curPosVec != )
{
cv::Mat Dict1 = imgVec.colRange(,curPosVec-);
cv::Mat Dict1_T = Dict1.t();
cv::Mat Dict2 = imgVec.colRange(curPosVec,imgVec.cols);
cv::Mat Dict2_T = Dict2.t();
Dict1_T.push_back(Dict2_T);
cv::Mat Dict_T = Dict1_T.clone();
Dict = Dict_T.t();
Dict = Dict.clone();
Dict1.release();
Dict2.release();
Dict_T.release();
Dict1_T.release();
Dict2_T.release();
}else
{
cv::Mat Dict1 = imgVec.colRange(,imgVec.cols);
Dict = Dict1.clone();
Dict1.release();
}
cv::Mat curPosImgVec = imgVec.colRange(curPosVec-,curPosVec);
QVector<int> index;
for(int i = ;i<row*col;i++)
index.push_back(i);
index.removeAt(curPosVec); if(flag == )
{
cv::Mat tmpCurPosImgVec = cv::repeat(curPosImgVec,,Dict.cols);
cv::Mat subMat = Dict - tmpCurPosImgVec;
subMat = subMat.mul(subMat);
cv::sqrt(subMat,subMat);
cv::reduce(subMat,subMat,,CV_REDUCE_SUM);
QuickSort(subMat,index,,row*col-);
for(int i = ;i<K;i++)
{
int r = index[i]/col;
int c = index[i]%col;
QPoint mPos;
mPos.setX(c);
mPos.setY(r);
resPoint.push_back(mPos);
}
}else
{
QVector<int> tmpIndex;
cv::Mat A = ormpSparseRepresentation::ompSparseL2(Dict,curPosImgVec,tmpIndex,K);
for(int i = ;i<K;i++)
{
int r = index[tmpIndex[i]]/col;
int c = index[tmpIndex[i]]%col;
QPoint mPos;
mPos.setX(c);
mPos.setY(r);
resPoint.push_back(mPos);
}
}
}

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

三、显示

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

  1. PRML读书会第七章 Sparse Kernel Machines(支持向量机, support vector machine ,KKT条件,RVM)

    主讲人 网神 (新浪微博: @豆角茄子麻酱凉面) 网神(66707180) 18:59:22  大家好,今天一起交流下PRML第7章.第六章核函数里提到,有一类机器学习算法,不是对参数做点估计或求其分 ...

  2. 深度学习与计算机视觉系列(2)_图像分类与KNN

    作者: 寒小阳 &&龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49949535 ht ...

  3. 机器学习笔记(5) KNN算法

    这篇其实应该作为机器学习的第一篇笔记的,但是在刚开始学习的时候,我还没有用博客记录笔记的打算.所以也就想到哪写到哪了. 你在网上搜索机器学习系列文章的话,大部分都是以KNN(k nearest nei ...

  4. 美团店铺评价语言处理以及分类(tfidf,SVM,决策树,随机森林,Knn,ensemble)

    第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三篇 朴素贝叶斯文本分类 支持向量机分类 支持向量机 网格搜索 临近法 决策树 随机森林 bagging方法 import pandas as pd ...

  5. ISSCC 2017论文导读 Session 14: A 28nm SoC with a 1.2GHz Prediction Sparse Deep-Neural-Network Engine

    A 28nm SoC with a 1.2GHz 568nJ/Prediction Sparse Deep-Neural-Network Engine with >0.1 Timing Erro ...

  6. 用KNN实现iris的4分类问题&测试精度

    import matplotlib.pyplot as plt from scipy import sparse import numpy as np import matplotlib as mt ...

  7. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  8. K近邻法(KNN)原理小结

    K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...

  9. kd树和knn算法的c语言实现

    基于kd树的knn的实现原理可以参考文末的链接,都是一些好文章. 这里参考了别人的代码.用c语言写的包括kd树的构建与查找k近邻的程序. code: #include<stdio.h> # ...

随机推荐

  1. ulimit 参数介绍

    Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限制.下面我把某linux用户的最 ...

  2. css-盒模型,浮动,定位之间的关系

    网站布局属性:盒模型:调整元素间距float浮动:竖排的块级元素改成横排position定位:重叠元素,精确控制元素位置 能用盒模型,不用float,能用浮动,不用定位

  3. vs2012快捷键失效解决办法

    快速解决vs开发工具快捷键失效,看图

  4. 网站全局js代码

    这几天开始看公司的一套系统,整理的网站全局js代码 /*文件名:base.js功能说明:全站通用的全局变量及公用方法创建日期:2010-09-26*///引入jquery库文件document.wri ...

  5. sql server windows账号不能登陆指定的数据库

    问题描述: 1. windows账号登陆后,默认的数据库被删除 2. SA账号密码也忘记了 此时就会导致用windows账号登陆Sql Server的时候,返回4064的错误,按照上面的问题描述,应该 ...

  6. XML配置silverlight ,wcf 解析xml

    XML 代码: <?xml version="1.0" encoding="utf-8" ?><ChartSet  xmlns:xsi=&qu ...

  7. 使用cocoapods后 三方库的头文件没有代码提示?

    选择Target -> Build Settings 菜单,找到\”User Header Search Paths\”设置项 新增一个值"${SRCROOT}",并且选择\ ...

  8. Jquery去除从数据库中查询到的内容含有的p标签

    $("#topic_content").html($("#topic_content").text()); 如果这个数据是通过循环遍历出的数据,就需要下面这个代 ...

  9. winPcap_1_开篇

    什么是WinPcap WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库. 因为有些应用程序需要直接访问网络中的数据包.也就是说,那些应用程序需要访问原始数据包,即没有被操 ...

  10. 【Nutch2.2.1基础教程之3】Nutch2.2.1配置文件

    nutch-site.xml 在nutch2.2.1中,有两份配置文件:nutch-default.xml与nutch-site.xml. 其中前者是nutch自带的默认属性,一般情况下不要修改. 如 ...