一、前言
图是一种重要的数据结构,本文主要表示图像的无向图。所谓无向图是指,图的节点间通过没有方向的边连接。
无向图的表示:
无向图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&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 }else33 {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 index;40 for(int i = 0;i
其中:排序与omp算法的代码见文档和文档
三、显示