Tiff图像处理3_Python

Tiff图波段重组

记录步骤有一点紊乱,应该是先发波段重组,之后再发拉伸的,这样比较符合操作的整个流程。。不过算了,先拉伸再做波段重组,好像这个流程也没什么问题。
使用的是师姐处理过一些的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卫星的波段顺序,一点点调,确定了切片的几个参数。
Tiff图像处理3_Python_第1张图片
然后又处理了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波段图,是从蓝波段开始的。(码一下图片,方便自己以后看波段信息)
Tiff图像处理3_Python_第2张图片
另一个收获就是学到了一个用法:

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,复制粘贴即可。

你可能感兴趣的:(遥感,图像处理,python,tiff,图像处理,计算机视觉)