作为摄影测量与遥感的从业者,笔者最近开始深入研究gdal,为工作打基础!个人觉得gdal也是没有什么技术含量,调用别人的api。但是想想这也是算法应用的一个技能,多学无害!
关于遥感图像的镶嵌,主要分为6大步骤:
step1:
1)对于每一幅图像,计算其行与列;
2)获取左上角X,Y
3)获取像素宽和像素高
4)计算max X 和 min Y,切记像素高是负值
maxX1 = minX1 + (cols1 * pixelWidth)
minY1 = maxY1 + (rows1 * pixelHeight)
step2 :计算输出图像的min X ,max X,min Y,max Y
minX = min(minX1, minX2, …)
maxX = max(maxX1, maxX2, …)
y坐标同理
step3:计算输出图像的行与列
cols = int((maxX – minX) / pixelWidth)
rows = int((maxY – minY) / abs(pixelHeight)
step 4:创建一个输出图像
driver.create()
step 5:
1)计算每幅图像左上角坐标在新图像的偏移值
2)依次读入每幅图像的数据并利用1)计算的偏移值将其写入新图像中
step6 :对于输出图像
1)刷新磁盘并计算统计值
2)设置输出图像的几何和投影信息
3)建立金字塔
下面附上笔者的代码:
#mosica 两张图像 import os, sys, gdal from gdalconst import * os.chdir('c:/temp/****')#改变文件夹路径 # 注册gdal(required) gdal.AllRegister() # 读入第一幅图像 ds1 = gdal.Open('**.img') band1 = ds1.GetRasterBand(1) rows1 = ds1.RasterYSize cols1 = ds1.RasterXSize # 获取图像角点坐标 transform1 = ds1.GetGeoTransform() minX1 = transform1[0] maxY1 = transform1[3] pixelWidth1 = transform1[1] pixelHeight1 = transform1[5]#是负值(important) maxX1 = minX1 + (cols1 * pixelWidth1) minY1 = maxY1 + (rows1 * pixelHeight1) # 读入第二幅图像 ds2 = gdal.Open('**.img') band2 = ds2.GetRasterBand(1) rows2 = ds2.RasterYSize cols2 = ds2.RasterXSize # 获取图像角点坐标 transform2 = ds2.GetGeoTransform() minX2 = transform2[0] maxY2 = transform2[3] pixelWidth2 = transform2[1] pixelHeight2 = transform2[5] maxX2 = minX2 + (cols2 * pixelWidth2) minY2 = maxY2 + (rows2 * pixelHeight2) # 获取输出图像坐标 minX = min(minX1, minX2) maxX = max(maxX1, maxX2) minY = min(minY1, minY2) maxY = max(maxY1, maxY2) #获取输出图像的行与列 cols = int((maxX - minX) / pixelWidth1) rows = int((maxY - minY) / abs(pixelHeight1)) # 计算图1左上角的偏移值(在输出图像中) xOffset1 = int((minX1 - minX) / pixelWidth1) yOffset1 = int((maxY1 - maxY) / pixelHeight1) # 计算图2左上角的偏移值(在输出图像中) xOffset2 = int((minX2 - minX) / pixelWidth1) yOffset2 = int((maxY2 - maxY) / pixelHeight1) # 创建一个输出图像 driver = ds1.GetDriver() dsOut = driver.Create('mosiac.img', cols, rows, 1, band1.DataType)#1是bands,默认 bandOut = dsOut.GetRasterBand(1) # 读图1的数据并将其写到输出图像中 data1 = band1.ReadAsArray(0, 0, cols1, rows1) bandOut.WriteArray(data1, xOffset1, yOffset1) #读图2的数据并将其写到输出图像中 data2 = band2.ReadAsArray(0, 0, cols2, rows2) bandOut.WriteArray(data2, xOffset2, yOffset2) ''' 写图像步骤''' # 统计数据 bandOut.FlushCache()#刷新磁盘 stats = bandOut.GetStatistics(0, 1)#第一个参数是1的话,是基于金字塔统计,第二个 #第二个参数是1的话:整幅图像重度,不需要统计 # 设置输出图像的几何信息和投影信息 geotransform = [minX, pixelWidth1, 0, maxY, 0, pixelHeight1] dsOut.SetGeoTransform(geotransform) dsOut.SetProjection(ds1.GetProjection()) # 建立输出图像的金字塔 gdal.SetConfigOption('HFA_USE_RRD', 'YES') dsOut.BuildOverviews(overviewlist=[2,4,8,16])#4层
补充知识:运用Python的第三方库:GDAL进行遥感数据的读写
0 背景及配置环境
0.1 背景
GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
这个开源栅格空间数据转换库拥有许多和其他语言的接口,对于python,他有对应的第三方包GDAL,下载安装已在上篇文章中提到。
目的: 可以使用Python的第三方包:GDAL进行遥感数据的读写,方便批处理。
0.2 配置环境
电脑系统: win7x64
Python版本: 3.6.4
GDAL版本: 2.3.2
1 读
1.1 TIFF格式
标签图像文件格式(Tag Image File Format,简写为TIFF)是一种灵活的位图格式,主要用来存储包括照片和艺术图在内的图像。它最初由Aldus公司与微软公司一起为PostScript打印开发。TIFF与JPEG和PNG一起成为流行的高位彩色图像格式。
TIFF文件以.tif为扩展名。
def tif_read(tifpath, bandnum): """ Use GDAL to read data and transform them into arrays. :param tifpath:tif文件的路径 :param bandnum:需要读取的波段 :return:该波段的数据,narray格式。len(narray)是行数,len(narray[0])列数 """ image = gdal.Open(tifpath) # 打开该图像 if image == None: print(tifpath + "该tif不能打开!") return lie = image.RasterXSize # 栅格矩阵的列数 hang = image.RasterYSize # 栅格矩阵的行数 im_bands = image.RasterCount # 波段数 im_proj = image.GetProjection() # 获取投影信息 im_geotrans = image.GetGeoTransform() # 仿射矩阵 print('该tif:{}个行,{}个列,{}层波段, 取出第{}层.'.format(hang, lie, im_bands, bandnum)) band = image.GetRasterBand(bandnum) # Get the information of band num. band_array = band.ReadAsArray(0,0,lie,hang) # Getting data from zeroth rows and 0 columns # band_df = pd.DataFrame(band_array) del image # 减少冗余 return band_array, im_proj, im_geotrans
2 写
2.1 TIFF格式
TIFF格式的数据格式有:Byete、int16、uint16、int32、uint32、float32、float64等7余种。
首先,要判断数据的格式,才能按需求写出。
def tif_write(self, filename, im_data, im_proj, im_geotrans): """ gdal数据类型包括 gdal.GDT_Byte, gdal.GDT_UInt16, gdal.GDT_Int16, gdal.GDT_UInt32, gdal.GDT_Int32, gdal.GDT_Float32, gdal.GDT_Float64 :param filename: 存出文件名 :param im_data: 输入数据 :param im_proj: 投影信息 :param im_geotrans: 放射变换信息 :return: 0 """ 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 # 多维或1.2维 #创建文件 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
3 展示
3.1 TIFF格式
# 这个展示的效果并不是太好,当做示意图用 def tif_display(self,im_data): """ :param im_data: 影像数据,narray :return: 展出影像 """ # plt.imshow(im_data,'gray') # 必须规定为显示的为什么图像 plt.imshow(im_data) # 必须规定为显示的为什么图像 plt.xticks([]), plt.yticks([]) # 隐藏坐标线 plt.show() # 显示出来,不要也可以,但是一般都要了
以上这篇python+gdal+遥感图像拼接(mosaic)的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]