最近需要对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. 实战交付一套dubbo微服务到k8s集群(4)之dubbo微服务底包镜像制作

    1.下载jre镜像 在运维主机(mfyxw50.mfyxw.com)操作 [root@mfyxw50 ~]# docker pull registry.cn-hangzhou.aliyuncs.com ...

  2. oslab oranges 一个操作系统的实现 实验三 认识保护模式(二):分页

    实验目的: 掌握内存分页机制 对应章节:3.3 实验内容: 1.认真阅读章节资料,掌握什么是分页机制 2. 调试代码,掌握分页机制基本方法与思路 – 代码3.22中,212行---237行,设置断点调 ...

  3. 鸟哥的linux私房菜——第六章学习(Linux文件与目录管理)

    ******************第六章学习****************** 1.[文件与目录管理] 在所有目录下面都会存在的两个目录,分别是 "." 与 "..& ...

  4. Web 实时通信方案 All In One

    Web 实时通信方案 All In One HTTP 轮询, 单向通信,开销大 HTTP 长轮询, 单向通信,开销较小 WebSocket,双向通信,开销小 (TCP 高延迟,保证数据完整性) Ser ...

  5. UIKit and SwiftUI

    UIKit and SwiftUI Live Preview Try Again or Resume refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许 ...

  6. 如何使用 js 检测控制台被用户打开了

    如何使用 js 检测控制台被用户打开了 js solutions 监听 F12 事件 监听键盘快捷键组合 Ctrl + Shift + I Option + Command + I Object.to ...

  7. OTA development

    OTA development OTA update OTA Over the Air / 无线下载 https://en.wikipedia.org/wiki/Over-the-air_progra ...

  8. VSCode & SQL

    VSCode & SQL MySQL MySQL https://marketplace.visualstudio.com/items?itemName=formulahendry.vscod ...

  9. node.js & create file

    node.js & create file node js create file if not exists https://nodejs.org/api/fs.html#fs_fs_ope ...

  10. c++ 使用PID获取顶级窗口句柄和标题

    #include <iostream> #include <Windows.h> using namespace std; BOOL CALLBACK EnumWindowsP ...