前言
前阵子进行深度学习研究的时候,有时候要对图像去均值的操作。这时候就要获取图像各个通道的平均值(MEAN)和方差(STD)。在网上找了很多方法,但是大多数是针对.jpg,.png等格式的图像,用的库也是是PIL和CV2。但因为我要处理的图像是.tif格式的遥感影像图,所以上面两个库对我来说都不怎么友好。下面为大家介绍.tif格式图计算平均值和方差的方法。
方法一:arcgis
【获取栅格属性】工具和【栅格计算器】一样,经常失灵(例如,尽管选了计算第二个波段的均值,但是结果还是第一个波段的均值),老是得到一些错误的结果,有可能是因为破解版的原因,我没用过正版的,所以没办法测试是不是破解版的才会出错。还有一个小tip,在使用这个工具之前,最好先用【计算统计数据】计算后再用【获取栅格属性】。别问为什么,问就是经验所得。
这个方法不推荐,因为经常获得错误结果,如果你是正版使用者可以试一下,测试结果可以留言告诉我一下哈哈哈…
arcgis -> 数据管理工具 -> 栅格 -> 栅格属性 -> 【获取栅格属性】
arcgis -> 数据管理工具 -> 栅格 -> 栅格属性 -> 【计算统计数据】
方法二:arcpy模块
*****五星推荐
# -*- coding:UTF-8 -*-
import arcpy
'''
1、gdal 模块可以实现,但是要通过xy坐标值才能获取相应的 pixel value,过程较为麻烦
2、arcpy 模块里面有 GetRasterProperties_management方法,可以读取不同波段的不同计算方法
3、直接在arcgis -> 数据管理工具 -> 栅格 -> 栅格属性 -> 获取栅格数据 这个工具不知道为什么在桌面端里面计算的值都是一个波段的值,似乎
选择波段不起作用,可能是破解版的BUG
'''
path = r'输入tif的路径'
bands = 7 # 输入你影像的波段数量
# 下面函数的功能和方法一【计算统计数据】功能一样
arcpy.CalculateStatistics_management(path, '', '', '', '', '')
for i in range(1, bands + 1 ):
# 第二个参数输入MEAN是求平均值,STD是求方差。还有很多个功能,这时候的arcpy真香
result = arcpy.GetRasterProperties_management(path, 'MEAN', 'Band_{}'.format(i))
mean = result.getOutput(0)
print mean
下图为参数二的变量,功能还是很强大滴,如果看不清直接去找arcgis的帮助文档
方法三:gdal
这个方法其实我也没用过,只是在csdn有看到。有一种是通过gdal遍历所有像元及其像素值,然后再计算平均值和方差,麻烦的我直接放弃。后来又看到了类似arcpy.GetRasterProperties_management()函数,就是
dsout.GetRasterBand(i).ComputeStatistics()。这个方法我没有使用过,仅供参考。
from osgeo import gdal
gdalObject = gdal.Open('路径')
# i 为波段
gdalObject.GetRasterBand(i).ComputeStatistics(false, out tmpDou, out tmpDou, out tmpDou, out tmpDou, null, null)
就是把所有的波段都调用一下ComputeStatistics函数即可,该函数第一个参数为Bool型,按照官网解释,如果为True,那么GDAL会尝试先从金字塔文件中去计算统计值,
第二到五个参数分别为该波段的最小值,最大值,平均值,均方差,最后两个参数是可以用来显示进度的,一般用不上。