最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python+gdal+遙感圖像拼接(mosaic)的實(shí)例

 更新時(shí)間:2020年03月10日 14:38:35   作者:爰采麥矣  
這篇文章主要介紹了python+gdal+遙感圖像拼接(mosaic)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

作為攝影測(cè)量與遙感的從業(yè)者,筆者最近開始深入研究gdal,為工作打基礎(chǔ)!個(gè)人覺得gdal也是沒有什么技術(shù)含量,調(diào)用別人的api。但是想想這也是算法應(yīng)用的一個(gè)技能,多學(xué)無害!

關(guān)于遙感圖像的鑲嵌,主要分為6大步驟:

step1:

1)對(duì)于每一幅圖像,計(jì)算其行與列;

2)獲取左上角X,Y

3)獲取像素寬和像素高

4)計(jì)算max X 和 min Y,切記像素高是負(fù)值

maxX1 = minX1 + (cols1 * pixelWidth)
minY1 = maxY1 + (rows1 * pixelHeight)

step2 :計(jì)算輸出圖像的min X ,max X,min Y,max Y

minX = min(minX1, minX2, …)
maxX = max(maxX1, maxX2, …)

y坐標(biāo)同理

step3:計(jì)算輸出圖像的行與列

cols = int((maxX – minX) / pixelWidth)
rows = int((maxY – minY) / abs(pixelHeight)

step 4:創(chuàng)建一個(gè)輸出圖像

driver.create()

step 5:

1)計(jì)算每幅圖像左上角坐標(biāo)在新圖像的偏移值

2)依次讀入每幅圖像的數(shù)據(jù)并利用1)計(jì)算的偏移值將其寫入新圖像中

step6 :對(duì)于輸出圖像

1)刷新磁盤并計(jì)算統(tǒng)計(jì)值

2)設(shè)置輸出圖像的幾何和投影信息

3)建立金字塔

下面附上筆者的代碼:

#mosica 兩張圖像
import os, sys, gdal
from gdalconst import *
os.chdir('c:/temp/****')#改變文件夾路徑
# 注冊(cè)gdal(required)
gdal.AllRegister()

# 讀入第一幅圖像
ds1 = gdal.Open('**.img')
band1 = ds1.GetRasterBand(1)
rows1 = ds1.RasterYSize
cols1 = ds1.RasterXSize

# 獲取圖像角點(diǎn)坐標(biāo)
transform1 = ds1.GetGeoTransform()
minX1 = transform1[0]
maxY1 = transform1[3]
pixelWidth1 = transform1[1]
pixelHeight1 = transform1[5]#是負(fù)值(important)
maxX1 = minX1 + (cols1 * pixelWidth1)
minY1 = maxY1 + (rows1 * pixelHeight1)

# 讀入第二幅圖像
ds2 = gdal.Open('**.img')
band2 = ds2.GetRasterBand(1)
rows2 = ds2.RasterYSize
cols2 = ds2.RasterXSize

# 獲取圖像角點(diǎn)坐標(biāo)
transform2 = ds2.GetGeoTransform()
minX2 = transform2[0]
maxY2 = transform2[3]
pixelWidth2 = transform2[1]
pixelHeight2 = transform2[5]
maxX2 = minX2 + (cols2 * pixelWidth2)
minY2 = maxY2 + (rows2 * pixelHeight2)

# 獲取輸出圖像坐標(biāo)
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))

# 計(jì)算圖1左上角的偏移值(在輸出圖像中)
xOffset1 = int((minX1 - minX) / pixelWidth1)
yOffset1 = int((maxY1 - maxY) / pixelHeight1)

# 計(jì)算圖2左上角的偏移值(在輸出圖像中)
xOffset2 = int((minX2 - minX) / pixelWidth1)
yOffset2 = int((maxY2 - maxY) / pixelHeight1)

# 創(chuàng)建一個(gè)輸出圖像
driver = ds1.GetDriver()
dsOut = driver.Create('mosiac.img', cols, rows, 1, band1.DataType)#1是bands,默認(rèn)
bandOut = dsOut.GetRasterBand(1)

# 讀圖1的數(shù)據(jù)并將其寫到輸出圖像中
data1 = band1.ReadAsArray(0, 0, cols1, rows1)
bandOut.WriteArray(data1, xOffset1, yOffset1)

#讀圖2的數(shù)據(jù)并將其寫到輸出圖像中
data2 = band2.ReadAsArray(0, 0, cols2, rows2)
bandOut.WriteArray(data2, xOffset2, yOffset2)
''' 寫圖像步驟'''
# 統(tǒng)計(jì)數(shù)據(jù)
bandOut.FlushCache()#刷新磁盤
stats = bandOut.GetStatistics(0, 1)#第一個(gè)參數(shù)是1的話,是基于金字塔統(tǒng)計(jì),第二個(gè)
#第二個(gè)參數(shù)是1的話:整幅圖像重度,不需要統(tǒng)計(jì)
# 設(shè)置輸出圖像的幾何信息和投影信息
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層

補(bǔ)充知識(shí):運(yùn)用Python的第三方庫(kù):GDAL進(jìn)行遙感數(shù)據(jù)的讀寫

0 背景及配置環(huán)境

0.1 背景

GDAL(Geospatial Data Abstraction Library)是一個(gè)在X/MIT許可協(xié)議下的開源柵格空間數(shù)據(jù)轉(zhuǎn)換庫(kù)。它利用抽象數(shù)據(jù)模型來表達(dá)所支持的各種文件格式。它還有一系列命令行工具來進(jìn)行數(shù)據(jù)轉(zhuǎn)換和處理。

這個(gè)開源柵格空間數(shù)據(jù)轉(zhuǎn)換庫(kù)擁有許多和其他語(yǔ)言的接口,對(duì)于python,他有對(duì)應(yīng)的第三方包GDAL,下載安裝已在上篇文章中提到。

目的: 可以使用Python的第三方包:GDAL進(jìn)行遙感數(shù)據(jù)的讀寫,方便批處理。

0.2 配置環(huán)境

電腦系統(tǒng): win7x64
Python版本: 3.6.4
GDAL版本: 2.3.2

1 讀

1.1 TIFF格式

標(biāo)簽圖像文件格式(Tag Image File Format,簡(jiǎn)寫為TIFF)是一種靈活的位圖格式,主要用來存儲(chǔ)包括照片和藝術(shù)圖在內(nèi)的圖像。它最初由Aldus公司與微軟公司一起為PostScript打印開發(fā)。TIFF與JPEG和PNG一起成為流行的高位彩色圖像格式。

TIFF文件以.tif為擴(kuò)展名。

 def tif_read(tifpath, bandnum):
  """
  Use GDAL to read data and transform them into arrays.
  :param tifpath:tif文件的路徑
  :param bandnum:需要讀取的波段
  :return:該波段的數(shù)據(jù),narray格式。len(narray)是行數(shù),len(narray[0])列數(shù)
  """
  image = gdal.Open(tifpath) # 打開該圖像
  if image == None:
   print(tifpath + "該tif不能打開!")
   return
  lie = image.RasterXSize # 柵格矩陣的列數(shù)
  hang = image.RasterYSize # 柵格矩陣的行數(shù)
  im_bands = image.RasterCount # 波段數(shù)
  im_proj = image.GetProjection() # 獲取投影信息
  im_geotrans = image.GetGeoTransform() # 仿射矩陣
  print('該tif:{}個(gè)行,{}個(gè)列,{}層波段, 取出第{}層.'.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格式的數(shù)據(jù)格式有:Byete、int16、uint16、int32、uint32、float32、float64等7余種。

首先,要判斷數(shù)據(jù)的格式,才能按需求寫出。

def tif_write(self, filename, im_data, im_proj, im_geotrans):
  """
  gdal數(shù)據(jù)類型包括
  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: 輸入數(shù)據(jù)
  :param im_proj: 投影信息
  :param im_geotrans: 放射變換信息
  :return: 0 
  """
  if 'int8' in im_data.dtype.name: # 判斷柵格數(shù)據(jù)的數(shù)據(jù)類型
   datatype = gdal.GDT_Byte
  elif 'int16' in im_data.dtype.name:
   datatype = gdal.GDT_UInt16
  else:
   datatype = gdal.GDT_Float32
  # 判讀數(shù)組維數(shù)
  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維
  #創(chuàng)建文件
  driver = gdal.GetDriverByName("GTiff")   #數(shù)據(jù)類型必須有,因?yàn)橐?jì)算需要多大內(nèi)存空間
  dataset = driver.Create(filename, im_width, im_height, im_bands, datatype)
  dataset.SetGeoTransform(im_geotrans)    #寫入仿射變換參數(shù)
  dataset.SetProjection(im_proj)     #寫入投影
  if im_bands == 1:
   dataset.GetRasterBand(1).WriteArray(im_data) #寫入數(shù)組數(shù)據(jù)
  else:
   for i in range(im_bands):
    dataset.GetRasterBand(i+1).WriteArray(im_data[i])
  del dataset

3 展示

3.1 TIFF格式

# 這個(gè)展示的效果并不是太好,當(dāng)做示意圖用
 def tif_display(self,im_data):
  """
  :param im_data: 影像數(shù)據(jù),narray
  :return: 展出影像
  """
  # plt.imshow(im_data,'gray') # 必須規(guī)定為顯示的為什么圖像
  plt.imshow(im_data) # 必須規(guī)定為顯示的為什么圖像
  plt.xticks([]), plt.yticks([]) # 隱藏坐標(biāo)線
  plt.show() # 顯示出來,不要也可以,但是一般都要了

以上這篇python+gdal+遙感圖像拼接(mosaic)的實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中np.argmax()函數(shù)用法示例

    Python中np.argmax()函數(shù)用法示例

    np.argmax是用于取得數(shù)組中每一行或者每一列的的最大值,常用于機(jī)器學(xué)習(xí)中獲取分類結(jié)果、計(jì)算精確度等,下面這篇文章主要給大家介紹了關(guān)于Python中np.argmax()函數(shù)用法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • pycharm編寫spark程序,導(dǎo)入pyspark包的3中實(shí)現(xiàn)方法

    pycharm編寫spark程序,導(dǎo)入pyspark包的3中實(shí)現(xiàn)方法

    這篇文章主要介紹了pycharm編寫spark程序,導(dǎo)入pyspark包的3中實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 對(duì)python讀寫文件去重、RE、set的使用詳解

    對(duì)python讀寫文件去重、RE、set的使用詳解

    今天小編就為大家分享一篇對(duì)python讀寫文件去重、RE、set的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題

    關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題

    這篇文章主要介紹了關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • pandas中pd.groupby()的用法詳解

    pandas中pd.groupby()的用法詳解

    本文主要介紹了pandas中pd.groupby()的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • 使用Python制作一個(gè)惡意軟件刪除工具

    使用Python制作一個(gè)惡意軟件刪除工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python制作一個(gè)惡意軟件刪除工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • Python中map,reduce,filter和sorted函數(shù)的使用方法

    Python中map,reduce,filter和sorted函數(shù)的使用方法

    這篇文章主要介紹了Python中map,reduce,filter和sorted函數(shù)的使用方法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • 使用Flask-Login模塊實(shí)現(xiàn)用戶身份驗(yàn)證和安全性

    使用Flask-Login模塊實(shí)現(xiàn)用戶身份驗(yàn)證和安全性

    當(dāng)你想要在你的Flask應(yīng)用中實(shí)現(xiàn)用戶身份驗(yàn)證和安全性時(shí),F(xiàn)lask-Login這個(gè)擴(kuò)展將會(huì)是你的最佳伙伴,它提供了一組簡(jiǎn)單而強(qiáng)大的工具來處理,下面我們就來看看具體的操作方法吧
    2023-08-08
  • TensorFlow變量管理詳解

    TensorFlow變量管理詳解

    這篇文章主要為大家詳細(xì)介紹了TensorFlow變量管理的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python抓取網(wǎng)頁(yè)圖片示例(python爬蟲)

    python抓取網(wǎng)頁(yè)圖片示例(python爬蟲)

    這篇文章主要介紹了python抓取網(wǎng)頁(yè)圖片示例(python爬蟲),需要的朋友可以參考下
    2014-04-04

最新評(píng)論

大竹县| 仙游县| 临邑县| 化州市| 永善县| 和顺县| 资源县| 太仆寺旗| 策勒县| 莒南县| 阳原县| 航空| 九寨沟县| 花莲市| 固始县| 当雄县| 保山市| 玉树县| 巩留县| 黑龙江省| 鸡泽县| 疏勒县| 繁峙县| 宁陕县| 福鼎市| 曲沃县| 湄潭县| 鄂伦春自治旗| 东乌珠穆沁旗| 广平县| 临清市| 安岳县| 梅河口市| 肃南| 内江市| 克什克腾旗| 馆陶县| 仙游县| 成都市| 屏山县| 绿春县|