珞珈一号夜光遥感影像可以从这个网址下载到,但由于数据传输、存储等问题,下载下来的原始数据并不是想象中可以直接拿来用的灰度值,而是需要进行一些转换,如下面网页提示。
实际转换可以使用ArcGIS、ENVI等软件操作,也可以通过编写代码实现。本篇博客主要介绍利用Python实现需求,读写TIFF文件代码参考这篇博客。
1.代码
转换主要分为两步,第一步是按照网页中给出的公式将下载下来影像中的灰度值转换为L(绝对辐射校正后辐射亮度值),这里得到的L是非常小的浮点型小数,是没有办法直接拿来应用的,需要对其进行灰度离散和量化。 第二步就是依据用户的需求,将L映射到指定灰度范围。新增的转换相关代码如下。
def convertData(data):
cvt_data = np.power(data, 1.5) * pow(10, -10)
return cvt_data
def discreteGrayscale(data, bits=10):
max_value = np.max(data)
min_value = np.min(data)
scale = (pow(2, bits) - 1) / (max_value - min_value)
res = data * scale
if 1 <= bits <= 8:
res_int = res.astype(np.uint8)
elif 9 <= bits <= 16:
res_int = res.astype(np.uint16)
elif 17 <= bits <= 32:
res_int = res.astype(np.uint32)
else:
res_int = res.astype(np.int)
return res_int
完整代码见Github项目,点击查看。为了使用方便,将相关输入以脚本启动参数的形式输入,这样便于自动以及批量化执行。 启动需要两个参数,第一个参数是待转换影像的路径,第二个参数是转换后影像的量化级数,如变成8bit量化或10bit量化或其它等等。
2.测试
启动PowerShell,依次输入参数并运行,如下。 用ENVI打开转换后的影像,可以看到影像已经变成了想要的灰度值。 可以看到影像的最大值已经变成了之前输入的10bit量化的最大值1023。这样便十分简单地满足了我们的需求。
3.灰度拉伸
利用上述代码转换出来的影像其实看起来不是很好看,因为考虑到这只是个转换工具,不应该修改数据导致损失,因此没有对影像进行“灰度拉伸”。 后续处理中完全可以在ENVI中用2%线性拉伸处理一下效果就会好很多了。
本文作者原创,未经许可不得转载,谢谢配合