zoukankan      html  css  js  c++  java
  • (一)建筑物多边形化简系列——去除噪点环

    由于本人最近在进行建筑物数据处理的项目,遇到了较多的问题,同时也收获了很多知识。所有打算写一个建筑物处理的系列博客。

    要处理建筑物多边形,首先得理解结构关系,这是所有实现处理的基础。建筑物多边形是由一条条封闭的环(线状)组成,环是由一组首尾相同的点组成,所以对建筑物多边形的处理实质是对环和点处理。

    实际项目中,所给的数据是非常凌乱的,杂质非常多。下图是初始的建筑物多边形数据,我们可以发现:局部有大量黑色点,放大发现并不是黑色,而是多边形中环太小太多,数据量大且杂,分布非常广泛。另外程序运行速度非常慢。这两点说明需要对数据进行过滤处理,即对噪点环进行过滤删除处理。

    局部放大发现黑点是小环,即噪点环。

    1)噪点环

    顾名思义就是图上的噪点,只不过噪点不是点,而是一个个小环,这些环特点为:面积小;数量多且分布广;明显不是建筑物多边形;这些小环与正常的建筑物的环实质上只有面积上的差别,小环面积很小。

    要进行建筑物化简得到最终成功,必须先除去这些噪点环,否则由于环数量太大导致程序运行缓慢甚至卡死。

    2)去除的思路

    上面提到这些小环与正常的建筑物的环实质上只有面积上的差别,小环面积很小。所以可以设置一个面积阈值,把小于这个阈值的环一律舍弃,保留大于面积阈值的环。阈值的设定需要根据实际的项目要求。

    3)代码实现

    使用MFC和C++,VS2010,主体算法如下

    // zf,按面积过滤,0701
    void CGeoPolygon::ObjectFilterByArea(void)
    {
    	//按面积
    	vector<int> temp;  //定义数组,存噪点环
    	if(circleAreaList.size()!=0) vector<double>().swap(circleAreaList);  //数组设定为空
    	for(int i = 0;i<circles.size();i++)   //遍历环数组
    	{
    		double circlearea = circles[i]->getArea(circles[i]->pts);  //获取环的面积
    		circleAreaList.push_back(circlearea);
    		if(circlearea<=100000) temp.push_back(i); //*****设定阈值*****,当面积小于阈值,噪点环数组添加该数值
    	}
    	vector<CGeoPolyline*> tempPolyline;     //定义新的无噪点环的环数组
    	if(tempPolyline.size()!=0) vector<CGeoPolyline*>().swap(tempPolyline); //防止环数组不为空
    	for(int j = 0;j<circles.size();j++)     //添加非噪点环到数组中
    	{
    		bool answer = isContained(temp,j);    //判断j是否存在temp中,若存在说明为冗余环,新circles中不应有此环
    		if(answer == false)                   //若不存在说明不为冗余环,新circles应存此环
    			tempPolyline.push_back(circles[j]);   
    	}
    	tempPolyline.swap(circles);         //交换,得到去除冗余环之后的环circles
    }
    

     其中getArea函数是计算每个环的面积,输入的是每个环的点集。

    //zf,计算某个环的面积
    double CGeoPolyline::getArea(vector<CMyPoint*> pts)
    {
    	double minY = this->getMinY(pts);
    	double tempArea = 0;
    	double area = 0;
    	int size = pts.size();
    	for (int i = 0; i < size; i++) {
    		int j = i + 1;
    		if (i == size - 1) j = 0;
    		double h = pts[j]->Getx() - pts[i]->Getx();
    		double y1 = pts[i]->Gety() - minY;
    		double y2 = pts[j]->Gety() - minY;
    		tempArea = (y1 + y2)*h/2;
    		area = area + tempArea;
    	}
    	if (area < 0)
    		area = -area;
    	return area;
    }
    

     isContained函数判断某个数是不是在数组中,见下:

    // 判断某个数是不是在数组中,zf,0717
    bool CGeoPolygon::isContained(vector<int> temp, int i)
    {
    	bool answer = false;
    	for(int j = 0;j<temp.size();j++)
    	{
    		if(i == temp[j]) answer = true;
    		if(answer) break;
    	}
    	return answer;
    }
    

     4)实验结果,

    去除噪点环之前

    去除噪点环之后

    去除(过滤)前

     去除(过滤)后

    5)小结

    去掉(过滤)噪点环之后,发现图面明显变得清爽,同时由于噪点环的去除,总体环数量大幅减少,后续程序运行和各种操作也变得快捷。

  • 相关阅读:
    EasyDSS功能简介视频直播、直播鉴权(如何完美将EasyDSS过渡到新版)
    EasyNVR前端构建之输入框样式的调整
    NVR硬件录像机web无插件播放方案(支持取特定时间段视频流)
    Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)
    零基础实现摄像头的全平台直播 (二)公网直播的实现
    海康、大华NVR硬件录像机录像无插件全平台访问实现播放时间轴实现
    直播与虚拟直播
    CF585EPresent for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
    AT4519[AGC032D]Rotation Sort【dp】
    P5110块速递推【特征方程,分块】
  • 原文地址:https://www.cnblogs.com/fan-0802-WHU/p/9335103.html
Copyright © 2011-2022 走看看