最近需要对ecognition分割结果进行统计分析,以此来进一步判断其分割结果中的欠分割和过分割对象,在看了一篇论文后,发现了可以用一个参数H来判断每个切割对象的异质性,由于此方法需要用到arcgis和Python来配合,因此记录下。

公式大概如下:

从中可以看出,如果需要计算出参数H,我们需要先计算出每个对象的归一化方差和归一化的莫兰指数。

在计算必须的参数前,我们需要准备的数据包括:

1.原始遥感图像

2.运用ecognition进行切割后产生的标签文件和矢量文件(shp文件)。

下面开始进行操作:

1.打开arcgis,导入矢量文件和标签文件,以及原始遥感图像。

2.调用分区统计工具,输入参数同上,计算出每个区域对应的标准差,输出格式为tif格式(也就是标签图那样的形式)。

3.将上一步中生成的标准差的图像文件路径输入到Python代码中,进行处理。(这里一定要记住生成的文件是带有空间参考系的,需要用GDAL库进行读取保存操作)。

这里我在网上找了一个人家编号的读取和保存函数,可以进行调用:

from osgeo import gdal

class IMAGE:
# 读图像文件
def read_img(self, filename):
dataset = gdal.Open(filename) # 打开文件
im_width = dataset.RasterXSize # 栅格矩阵的列数
im_height = dataset.RasterYSize # 栅格矩阵的行数
im_bands = dataset.RasterCount # 波段数
im_geotrans = dataset.GetGeoTransform() # 仿射矩阵,左上角像素的大地坐标和像素分辨率
im_proj = dataset.GetProjection() # 地图投影信息,字符串表示
im_data = dataset.ReadAsArray(0, 0, im_width, im_height) del dataset return im_width, im_height, im_bands, im_proj, im_geotrans, im_data # 写GeoTiff文件
def write_img(self, filename, im_proj, im_geotrans, im_data): # 判断栅格数据的数据类型
if 'int8' in im_data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in im_data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32 # 判读数组维数
if len(im_data.shape) == 3:
im_bands, im_height, im_width = im_data.shape
else:
im_bands, (im_height, im_width) = 1, im_data.shape # 创建文件
driver = gdal.GetDriverByName("GTiff")
dataset = driver.Create(filename, im_width, im_height, im_bands, datatype) dataset.SetGeoTransform(im_geotrans) # 写入仿射变换参数
dataset.SetProjection(im_proj) # 写入投影 if im_bands == 1:
dataset.GetRasterBand(1).WriteArray(im_data) # 写入数组数据
else:
for i in range(im_bands):
dataset.GetRasterBand(i + 1).WriteArray(im_data[i]) del dataset

Python将标准差转为平差同时对图像进行归一化处理代码如下:

from service import IMAGE
import copy
import cv2
import numpy as np std_var_path = 'data/stardvar.tif'
var_path = 'data/var.tif' rw = IMAGE()
im_width, im_height, im_bands, im_proj, im_geotrans, im_data = rw.read_img(std_var_path) var = copy.deepcopy(im_data)
rows, cols = im_data.shape for row in range(rows):
for col in range(cols):
var[row][col] = im_data[row][col]**2 var = cv2.normalize(var,var,0,1,norm_type=cv2.NORM_MINMAX) # 方差归一化 rw.write_img(var_path,im_proj,im_geotrans,var) print('transform success!')

4.上面步骤计算出了归一化的方差数据,剩下的就是计算出归一化后的莫兰指数参数,moran指数参数是描述空间相关性的参数,进行计算的时候每个区域都要有一个指标才可以进行计算,本次记录中,我计算了每个区域的灰度的均值作为这个指标参数。

具体方法为:运用工具箱中的以“表格显示分区统计“工具,以shp文件为要素区域文件,原始遥感影像为赋值图像(软件会自动转为灰度图进行处理),选择字段为FID,保证唯一性。

5.上述操作最终会生成一个表格形式的文件,如下图所示:

我们需要将运用到这个表格中的mean参数,但是对于计算moran指数的工具来说,输入只能是shp矢量文件,因此我们需要将mean这一字段放到矢量文件中,可以在矢量文件字段表格中将两个表格进行连接操作。

以FID为连接字段(因为每个对象对应唯一的FID,方便进行确认),连接设置过程以及结果如下:

6.有了以上的带有均值字段的矢量文件,我们便可以进行局部莫兰指数的计算啦(如果是全局莫兰指数见我以前写的一篇吧),打开工具箱中的聚类和异常值分析工具,输入参数如下(记得一定要选择标准化!!!):

最终会输出一个记录莫兰指数的tif文件,和记录归一化方差的tif图一样。

7.完成以上操作,我们所需要的数据便都准备好啦,下面需要的就是开始计算H参数,这一步骤我在Python中执行,同样,根据代码自己修改路径就行啦。

from service import IMAGE
import copy
import cv2
import numpy as np # 通过归一化莫兰指数和归一化对象内方差计算H参数
# 后期提高效率可以通过标签图来统一修改图片
moran_path = 'data/moranout.tif'
var_path = 'data/var.tif'
H_path = 'data/H.tif' rw = IMAGE()
moran_width, moran_height, moran_bands, moran_proj, moran_geotrans, moran_data = rw.read_img(moran_path) var_width, var_height, var_bands, var_proj, var_geotrans, var_data = rw.read_img(var_path) '''rows, cols = moran_data.shape
H_data = np.zeros_like(var_data) for row in range(rows):
for col in range(cols):
nV = var_data[row][col]
nLMI = moran_data[row][col]
H_data[row][col] = (nV-nLMI)/(nV+nLMI)
print(H_data[row][col],nV,nLMI)''' H_data = (var_data-moran_data)/(var_data+moran_data) rw.write_img(H_path,var_proj,var_geotrans,H_data) print('H calculate completed!')

最终会生成一个记录H参数数值的tif标记图,达成目的。

以上便是我计算H参数的步骤,如果大家有更好的方法,希望及时告诉我。

计算异质性H值(运用arcgis和Python进行区域分析)的更多相关文章

  1. 在arcgis使用python脚本进行字段计算时是如何解决中文问题的

    来自:https://www.jb51.net/article/73561.htm 一.引言 在arcgis打开一个图层的属性表,可以对属性表的某个字段进行计算,但是在平常一般都是使用arcgis提供 ...

  2. 在arcgis使用python脚本进行字段计算时对中文的处理方案

    一.引言 在arcgis打开一个图层的属性表,可以对属性表的某个字段进行计算,但是在平常一般都是使用arcgis提供的字段计算器的界面进行傻瓜式的简答的赋值操作,并没有使用到脚本对字段值进行逻辑的操作 ...

  3. Python实现计算圆周率π的值到任意位的方法示例

    Python实现计算圆周率π的值到任意位的方法示例 本文实例讲述了Python实现计算圆周率π的值到任意位的方法.分享给大家供大家参考,具体如下: 一.需求分析 输入想要计算到小数点后的位数,计算圆周 ...

  4. python 计算文件md5值

    md5是一种常见不可逆加密算法,使用简单,计算速度快,在很多场景下都会用到,比如:给用户上传的文件命名,数据库中保存的用户密码,下载文件后检验文件是否正确等.下面讲解在python中如何使用md5算法 ...

  5. ArcPy开发教程1-面向ArcGIS的Python语言基础

    ArcPy开发教程1-面向ArcGIS的Python语言基础 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 第一节课 时间2019年2月26日 上午第一节 讲解:A ...

  6. 『基于ArcGIS的Python编程秘籍(第2版)』书本源码

    ArcPy学习 第1章 面向ArcGIS的Python编程语言的基础 略 第2章 管理地图文档和图层 引用当前的地图文档 引用磁盘上的地图文档 获取地图文档的图层列表 限制图层列表 缩放至所选要素 改 ...

  7. Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法

    今天项目中碰到一个以前从没有见过的异常信息“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”,于是查了一下资料,原来此异常是由于我在代码中使用了"Response.End ...

  8. plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory

    装一台新服务器环境的时候,装uwsgi报错: plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or di ...

  9. 异常:Data = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。

    做项目的时候,将DataTable序列化成Json,通过ashx向前台返回数据的时候,前台总是获取不到数据,但是程序运行却没问题, 没抛出异常.一时找不到办法,减小输出的数据量,这时前台可以接收到页面 ...

随机推荐

  1. DOCKER - 构建一个docker镜像并跑起来

    一.有个基础镜像 1.基础镜像的选择 当前市场有众多可选择的基础docker镜像,可参考: https://blog.csdn.net/nklinsirui/article/details/80967 ...

  2. VS常用命令

    1.查看Windows文件首部信息 dumpbin/headers 项目名称. 例如:dumpbin/headers test.exe 2.查看CLR首部信息 dumpbin/clrheader 项目 ...

  3. Dapr是如何简化微服务的开发和部署

    基于微服务设计模式的现代应用程序面临着一系列挑战.微服务需要有一个强大的服务发现机制来实现动态连接.它们需要松散耦合,实现自主性和独立缩放.微服务需要支持多种语言,其中每个服务都是以最合适的语言.框架 ...

  4. 『数据结构与算法』二叉查找树(BST)

    微信搜索:码农StayUp 主页地址:https://gozhuyinglong.github.io 源码分享:https://github.com/gozhuyinglong/blog-demos ...

  5. 5分钟学Go 基础01:初识 Go 的第一印象是薪水可观

    本文首发于公众号「5分钟学Go」,一个让你每次花 5 分钟就能掌握一个技能点的公众号.目前在博主连更 5 分钟学Go系列,大家可以关注下,第一时间掌握Go技能.如果想要加群交流,可以在公众号后台回复「 ...

  6. Nmap & ncat

    Nmap & ncat https://github.com/udacity/course-ud303 https://nmap.org/dist/nmap-7.30-setup.exe Yo ...

  7. webpack loader & pulgin

    webpack loader & plugin https://webpack.js.org/concepts/loaders/ https://webpack.js.org/concepts ...

  8. push notifications

    push notifications https://developers.google.com/web/fundamentals/push-notifications/ Push API https ...

  9. windows10 安装NASM

    NASM官网 下载NASM NASM在线HTML文档 下载golink golink文档 NASM教程 in windows x64调用约定 x86调用约定 编码样式约定 在编写nasm时数字默认为1 ...

  10. JavaScript中判断对象是否属于Array类型的4种方法及其背后的原理与局限性

    前言 毫无疑问,Array.isArray是现如今JavaScript中判断对象是否属于Array类型的首选,但是我认为了解本文其余的方法及其背后的原理与局限性也是很有必要的,因为在JavaScrip ...