基于Python的面向对象分类实例Ⅱ
接上一部分继续介绍~
一、地类矢量转栅格
这一步是为了能让地类值和影像的对象落在同一区域,从而将影像中的分割对象同化为实际地物类别。
train_fn = r".\train_data1.shp"
train_ds = ogr.Open(train_fn)
lyr = train_ds.GetLayer()
driver = gdal.GetDriverByName('MEM')
target_ds = driver.Create('', im_width, im_height, 1, gdal.GDT_UInt16)
target_ds.SetGeoTransform(im_geotrans)
target_ds.SetProjection(im_proj)
options = ['ATTRIBUTE=tyPE']
gdal.RasterizeLayer(target_ds, [1], lyr, options=options)
data = target_ds.GetRasterBand(1).ReadAsArray()
ground_truth = target_ds.GetRasterBand(1).ReadAsArray()
ground_truth = ground_truth.transpose((1, 0))
classes = np.unique(ground_truth)[1:] 最终得到带有地物类别数据的栅格点数据。
二、特征匹配
将得到的栅格点真实地物数据通过迭代与影像对象相匹配后,通过迭代器寻找对象的相应特征。
segments_per_class = {}
for klass in classes:segments_of_class = segments[ground_truth == klass]segments_per_class[klass] = set(segments_of_class)intersection = set()
accum = set()
for class_segments in segments_per_class.values():intersection |= accum.intersection(class_segments)accum |= class_segments
assert len(intersection) == 0, "Segment(s) represent multiple classes"
print("adjust complete")
end3 = time.time()
print('Running time2: %s Seconds'%(end3-start3))print("start train randomforest classification")
start4 = time.time()
train_img = np.copy(segments)
threshold = train_img.max() + 1 for klass in classes:class_label = threshold + klassfor segment_id in segments_per_class[klass]:train_img[train_img == segment_id] = class_labeltrain_img[train_img <= threshold] = 0
train_img[train_img > threshold] -= thresholdtraining_objects = []
training_labels = []
for klass in classes:class_train_object = [v for i, v in enumerate(objects) if segment_ids[i] in segments_per_class[klass]]training_labels += [klass] * len(class_train_object)training_objects += class_train_object 在实际的影像样本构建过程中,有的地物样本可能彼此距离相差较小,造成两个或多个样本落在同一个分割区域,这样会导致特征匹配迭代无限进行下去,所以我们要从两个或多个样本中取其一。
三、分类
最后利用scikit-learn的随机森林分类器,对样本分割块和其他未定义分割块进行预测,最后将结果输出到栅格中。
def PolygonizeTheRaster(inputfile,outputfile):dataset = gdal.Open(inputfile, gdal.GA_ReadOnly)srcband=dataset.GetRasterBand(1)im_proj = dataset.GetProjection()prj = osr.SpatialReference() prj.ImportFromWkt(im_proj)drv = ogr.GetDriverByName('ESRI Shapefile')dst_ds = drv.CreateDataSource(outputfile)dst_layername = 'out'dst_layer = dst_ds.CreateLayer(dst_layername, srs=prj)dst_fieldname = 'DN'fd = ogr.FieldDefn(dst_fieldname, ogr.OFTInteger)dst_layer.CreateField(fd)dst_field = 0gdal.Polygonize(srcband, None, dst_layer, dst_field) classifier = RandomForestClassifier(n_jobs=-1)
classifier.fit(training_objects, training_labels)
predicted = classifier.predict(objects) clf = segments.copy()
for segment_id, klass in zip(segment_ids, predicted):clf[clf == segment_id] = klass
# temp = temp.transpose((2, 1, 0))
mask = np.sum(temp, axis=2)
mask[mask > 0.0] = 1.0
mask[mask == 0.0] = -1.0clf = np.multiply(clf, mask)
clf[clf < 0] = -9999.0
clf = clf.transpose((1, 0))
clfds = driverTiff.Create(r"D:\Data\testdata\classification\result.tif", im_width, im_height,1, gdal.GDT_Float32)
clfds.SetGeoTransform(im_geotrans)
clfds.SetProjection(im_proj)
clfds.GetRasterBand(1).SetNoDataValue(-9999.0)
clfds.GetRasterBand(1).WriteArray(clf)
clfds = Noneend4 = time.time()
outputfile = r".\result2.shp"
print('Running time2: %s Seconds'%(end4-start4))
PolygonizeTheRaster(r".\result.tif",outputfile) 类在影像中的标记ID是1、2、3等等数值,因此用一般的栅格查看软件很难从肉眼进行查看。这里为了方便读者查看以及制图,我还进行了栅格转矢量的操作,这样放到arcmap中能清晰的查看分类情况。
最后的分类结果:
图1 分类结果图
图2 林地分类效果
相关文章:
基于Python的面向对象分类实例Ⅱ
接上一部分继续介绍~ 一、地类矢量转栅格 这一步是为了能让地类值和影像的对象落在同一区域,从而将影像中的分割对象同化为实际地物类别。 train_fn r".\train_data1.shp" train_ds ogr.Open(train_fn) lyr train_ds.GetLayer() driver gdal.GetDrive…...
android手机莫名其妙卸载重装有残留数据
参考文档: https://developer.android.com/guide/topics/data/autobackup?hlzh-cn https://developer.android.com/about/versions/12/backup-restore#xml-changes https://stackoverflow.com/questions/70365809/how-to-specify-to-not-allow-any-data-backup-wit…...
【YOLOv5入门】目标检测
【大家好,我是爱干饭的猿,本文重点介绍YOLOv5入门-目标检测的任务、性能指标、yolo算法基本思想、yolov5网络架构图。 后续会继续分享其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】 上一篇…...
可验证随机函数(VRF)
文章目录 一、背景以及场景共识发展第一代 POW “以力取胜”第二代 POS/DPOS “民主投票”第三代 VRF “运气抽签” 二、可验证随机函数(VRF)快速开始1. VRF是什么?2. MD5 hash函数和VRF(Verifiable Random Function)区别3. VRF-…...
Node.js与npm的准备与操作
1.下载 Node.js官网:Node.jsNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/en 打开后的界面如下: LTS(Long Term Support):长期支持版,稳定版 Current&am…...
ui设计师简历自我评价的范文(合集)
ui设计师简历自我评价的范文篇一 本人毕业于艺术设计专业,具有较高的艺术素养,平时注重设计理论知识的积累,并将理论应用到作品中。了解当下设计的流行趋势,设计注重细节、重视用户体验,对色彩搭配有着浓厚的兴趣&…...
sqli-labs靶场详解(less32-less37)
宽字节注入 原理在下方 目录 less-32 less-33 less-34 less-35 less-36 less-37 less-32 正常页面 ?id1 下面有提示 获取到了Hint: The Query String you input is escaped as : 1\ ?id1 看来是把参数中的非法字符就加上了转义 从而在数据库中只能把单引号当成普通的字…...
如何保证缓存和数据库的双写一致性?
一、什么是数据库和缓存双写一致性? 在分布式系统中,数据库和缓存会搭配一起使用,以此来保证程序的整体查询性能。也就说,分布式系统为了缓解数据库查询的压力,会将查出来的数据保存在缓存中,下次再查询时…...
Rosbag 制作 TUM数据集
Rosbag 制作 TUM数据集 一、创建rgb和depth文件夹和txt文件 mkdir rgb mkdir depth touch rgb.txt touch depth.txt 二、替换 bag 路径 和 topic tum.py: import os import cv2 import numpy as np import rosbag from sensor_msgs.msg import Image from cv_b…...
本地websocket服务端暴露至公网访问【cpolar内网穿透】
本地websocket服务端暴露至公网访问【cpolar内网穿透】 文章目录 本地websocket服务端暴露至公网访问【cpolar内网穿透】1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功…...
男UI设计师主要是做什么的优漫教育
1、根据各种相关软件的用户群,提出构思新颖、有高度吸引力的创意设计; 2、对页面进行优化,使用户操作更趋于人性化; 3、维护现有的应用产品; 4、收集和分析用户对于GUI的需求。 二、需要学什么…...
超实用!Spring Boot 常用注解详解与应用场景
目录 一、Web MVC 开发时,对于三层的类注解 1.1 Controller 1.2 Service 1.3 Repository 1.4 Component 二、依赖注入的注解 2.1 Autowired 2.2 Resource 2.3 Resource 与 Autowired 的区别 2.3.1 实例讲解 2.4 Value 2.5 Data 三、Web 常用的注解 3.1…...
【古月居《ros入门21讲》学习笔记】11_客户端Client的编程实现
目录 说明: 1. 服务模型 2. 实现过程(C) 创建功能包 创建客户端代码(C) 配置客户端代码编译规则 编译 运行 3. 实现过程(Python) 创建客户端代码(Python) 运行…...
小程序和Vue写法的区别主要有什么不同
1.语法不同:小程序使用的是WXML、WXSS和JS,而Vue使用的是HTML、CSS和JSX。 2.数据绑定方式不同:小程序使用的是双向数据绑定,而Vue使用的是单向数据流。 1)在小程序中需要使用e.currentTarget.dataset.*的方式获取&…...
Flutter之MQTT使用
1.添加依赖: 首先,需要在Flutter项目的pubspec.yaml文件中添加mqtt_client依赖。 dependencies:#https://pub.dev/packages/mqtt_clientmqtt_client: ^10.0.02.创建MQTT客户端并连接到MQTT服务器:2.创建一个MQTT客户端实例来进行连接和通信 Fu…...
vr红色教育虚拟展馆全景制作提升单位品牌形象
720全景展馆编辑平台以其独特的优势,为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案,进一步提升了展览行业的水平和影响力。 一、提升展示效果,增强品牌形象 720全景展馆编辑平台通过…...
【Spring】Spring是什么?
文章目录 前言什么是Spring什么是容器什么是 IoC传统程序开发控制反转式程序开发理解Spring IoCDI Spring帮助网站 前言 前面我们学习了 servlet 的相关知识,但是呢?使用 servlet 进行网站的开发步骤还是比较麻烦的,而我们本身程序员就属于是…...
事件循环机制及常见面试题
借鉴: 《Javascript 忍者秘籍》第二版,事件循环篇 面试 | JS 事件循环 event loop 经典面试题含答案 - 知乎 (zhihu.com) 概念 主栈队列就是一个宏任务,每一个宏任务执行完就会执行宏任务中的微任务,直到微任务全部都执行完&a…...
智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?
视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...
c# statusStrip 显示电脑主机名、IP地址、MAC地址
控件: ToolStripStatusLabel 主机名: Dns.GetHostName() IP地址: Dns.GetHostAddresses(Dns.GetHostName())[0].ToString() 当前程序的版本: Assembly.GetExecutingAssembly().GetName().Version.ToString() 获取系统版本 …...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
