Daha çox

Pythonda .tiff rastersin redaktə edilməsi

Pythonda .tiff rastersin redaktə edilməsi


Pythonda .tif rasters redaktə etməyə çalışıram, amma tiff -in array konvertasiyası ilə bağlı bəzi problemlərim var. Oxudum ki, rasters açmaq üçün bir çox variant var (gdal, PIL, matplotlib), amma bunlardan hansını diziyə çevirməyimə, redaktə etməyimə (yerli filtrlər tətbiq etməyimə) və sonra yenidən .tif -a çevirməyimə icazə vermək üçün ən yaxşısıdır?

Məsələn, PIL kitabxanasından istifadə edərək .tif rasterdən massivlər açanda qəribə bir nəticə əldə edirəm.

Kod belə görünür:

matplotlib.pyplotu plt olaraq idxal edin matplotlib.image kimi mpimg idxal edin matplotlib.cm kimi cm idxal edin np idxal pywt kimi pw idxal tkFileDialog tk olaraq PIL idxal edir Image def fct (fisier): img = Image.open (fisier) arr = np.array (img, dtype = np.float) plt.imshow (arr, cmap = cm.Greys_r) plt.show () print (arr) return arr, img file = tk.askopenfile (initialdir = 'C:/temp ', mode = "rb") fct (fayl)

Ancaq bütün ağ rəngdə görünən və bu formaya malik olan sıra:

[[-2.14748365e+09 -2.14748365e+09 -2.14748365e+09…, 0.00000000e+00 0.00000000e+00 6.19762981e+08]

Tiff rasterini bir sıra olaraq açmaq üçün nə etməliyəm, buna görə daha da düzəldə bilərəm?


PIL və ya opencv kimi görüntü kitabxanaları görüntü işləmək üçün əladır, lakin geotifflərin coğrafi mövqeyini nəzərə almır. İstifadə etmək istəyirik gdal çünki proyeksiya növlərinin çoxunu tanıyır və digər CİS proqramları ilə uyğun olacaq bir geotiff faylı içərisində saxlaya bilir (məsələn, həm ArcGIS, həm də QGIS python gdal istifadə edir).

Coğrafi tiff fayllarını idarə edən bir neçə modul (yəni coğrafi mövqeyi ehtiva edən metadata ilə bir raster), gdaldan daha çox istifadəçi dostu və intuitivdir. Ancaq əksəriyyəti (hamısı olmasa da) gdal istifadə edir.

Bəzi hesablamalardan sonra piksel dəyərlərini dəyişdirmək məsələsinə gəldikdə (məsələn, bir geotiff rasterinin hər pikselini 4 -ə bölün), işim aşağıdakı kimi ümumiləşdirilə bilər:

  1. Tifti gdal ilə açın
  2. Ölçüləri, geotransformasiyanı və proyeksiyanı oxuyun və saxlayın
  3. Rasteri nömrəsiz bir sıra olaraq yükləyin
  4. Numpy ilə hesablama aparın
  5. Eyni ölçülü, geotransformasiya və orijinalın proyeksiyasına malik boş bir tiff konteyner yaradın
  6. Numpy dizisini tiff faylında qeyd edin

Qeyd: geotransformasiya, proyeksiya obyektində saxlanılan istinad sisteminə görə piksel ölçüsünü və sol alt künc pikselinin koordinatlarını saxlayan bir obyektdir.

gdal #1 idxal edin. tiff_file = gdal.Açın (raster_adı) #2. geotransform = tiff_file.GetGeoTransform () proyeksiya = tiff_file.GetProjection () band = tiff_file.GetRasterBand (1) xsize = band.XSize ysize = bant.YSize #3. array = band.ReadAsArray () tiff_file = Heç biri #onu bağla = Heç biri #bağla #4. array = array/4 #5. driver = gdal.GetDriverByName ('GTiff') new_tiff = driver.Create (output_raster_name, xsize, ysize, 1, gdal.GDT_Int16) new_tiff.SetGeoTransform (geotransform) new_tiff.SetProjection (projection) new_tiff.Get ) new_tiff.FlushCache () #Diskdə saxlayır new_tiff = Yox #faylı bağlayır

Gdal kitabxanasının ən böyük sənədləri olmasa da (python istifadəçiləri üçün oxunaqlılıq baxımından), metodlar olduqca sadə adlandırmalara malikdir. Nə etmək istədiyinizi bildiyiniz zaman bu çox köməkçi ola bilər.


GDAL ilə:

osgeo import gdal file = gdal.Open ('raster1.tif') band1 = file.GetRasterBand (1) a = band1.ReadAsArray ()

Tiffdə 3 qrupunuz var (RGB). Raster faylını açdıqdan sonra, bandı (1,2 və ya 3 -ü Qırmızı, Yaşıl və ya Mavi) almalı və sonra bandı sıra olaraq oxumalısınız. Əlbəttə ki, yalnız bir qrup ola bilər, amma hətta bu zaman ReadAsArray -dan əvvəl də onu əldə etməlisiniz.


GDAL, pitondan coğrafi məlumatlara daxil olmaq üçün ən çox istifadə olunan kitabxanadır. Təəssüf ki, zaman -zaman bir az anlaşılmaz ola bilər. GDAL -ın istifadəsini daha çox pythonic etməyə çalışan son bir inkişafdır rasterio

rasterio.open ('path/to/your/geo.tiff') ilə rasterio idxal edin: ds = src.read ()

Videoya baxın: Read and write raster files with GDAL in Python