记录步骤有一点紊乱,应该是先发波段重组,之后再发拉伸的,这样比较符合操作的整个流程。。不过算了,先拉伸再做波段重组,好像这个流程也没什么问题。
使用的是师姐处理过一些的Landsat卫星影像,7,8的都有。但是7和8对于波段数上面略有不同,所以师姐是全部按照前7个波段载下来给我的。也就是说,再做批处理的时候不用再考虑不同卫星的差别了,直接一次性投入全部操作就行。不过我还是在那之前,分别进行了小测试。
波段重组,也就是将原有的图像的N波段,提取其中的M(M≤N)个波段,进行重新组合,变成一张新的图像。
# 波段重组,将Landsat8的tif图的R,G,B波段按顺序抽出,并重组为新的三通道RGB的tif图
def selectTiffband8_RGB(img_path):
'''
实现遥感影像的波段重组
:param img_path: 待处理的单一图像路径
:return: 没啥return的,直接保存到本地了
'''
# 读取影像信息
img_array, img_geotrans, img_proj = readTiff(img_path)
# 波段选择,这里是选择R,G,B波段
dst_array = img_array[-9:-12:-1,::] # -9是R,-10是G,-11是B,step=-1,逆向截取,begin=-9,end=-12
dst_path = os.path.join(r"E:\small_data\RGB_Landsat8\image\29.tif") # 目标路径
# 写入修改后的影像
# print(img_array.shape) # 查看目标数组的维度
# print(dst_array.shape) # 查看目标数组的维度
# print(dst_array[0,::]) # Ged
# print(dst_array[1,::]) # Green
# print(dst_array[2,::]) # Blue
writeTiff(dst_array, img_geotrans, img_proj, dst_path)
print(dst_path, 'get!')
测试的话肯定是越方便越好,所以目标路径直接写函数里了,测试效果很好,和ArcGIS进行了对比,在数值上是一致的,观感上也没什么差别。
这里的坑吧就是,直接进行array到array的赋值,是顺序的。而Landsat8卫星里的顺序,是B,G,R,而不是R,G,B。如果按卫星影像的顺序,我得到的就是B,G,R图像,和常识不符不是很舒服,显示起来也不是真彩色。当然,处理起来没什么差别,毕竟数值都是对的上的,只不过是通道的选择不一样。所以就捡了一下这个python切片操作。然后对照着Landsat8卫星的波段顺序,一点点调,确定了切片的几个参数。
然后又处理了Landsat7的:
# 波段重组,将Landsat7的tif图的R,G,B波段按顺序抽出,并重组为新的三通道RGB的tif图
def selectTiffband7_RGB(img_path):
'''
实现遥感影像的波段重组
:param img_path:
:return:
'''
# 读取影像信息
img_array, img_geotrans, img_proj = readTiff(img_path)
# 波段选择,这里是选择R,G,B波段
dst_array = img_array[-5:-8:-1,::] # -5是R,-6是G,-7是B,step=-1,逆向截取,begin=-5,end=-8
dst_path = os.path.join(r"E:\lake\image_RGB\2019_07_08.tif") # 目标路径
# 写入修改后的影像
# print(img_array.shape) # 查看源数组的维度
# print(dst_array.shape) # 查看目标数组的维度
# print(dst_array[0,::]) # Red
# print(dst_array[1,::]) # Green
# print(dst_array[2,::]) # Blue
writeTiff(dst_array, img_geotrans, img_proj, dst_path)
print(dst_path, 'get!')
也就是更改了切片的参数罢了。这里有一些不一样的就是,Landsat7是从蓝波段开始的,而Landsat8不是从蓝波段开始的,所以end这个地方,还调了半天。最终,使用这个代码,也能够把师姐给我的统一的7波段tif图进行R,G,B的重组,测试也一致。因为给的7波段图,是从蓝波段开始的。(码一下图片,方便自己以后看波段信息)
另一个收获就是学到了一个用法:
dst_array[0,::]
这个就是相当于是将波段0的那一个二维矩阵进行操作了,省去了多个for循环的麻烦(因为这里第一个参数是波段)。在图像拉伸那一个里面,也用到了相同的操作。
在后续的学习中,又思考过,如果我提取的波段,不是连续的,那该如何去提取呢。我觉得可以这样,虽然比较繁琐,但是应该可行:
des_data = np.zeros(des_bands, src_height, src_width).astype(np.uint8)
des_data[0,::] = src_data[a,::]
des_data[1,::] = src_data[b,::]
des_data[2,::] = src_data[c,::]
# 按目标图像的波段顺序,依次写下去
读、写代码参考1,复制粘贴即可。