Raster tamamen numpy dizisine yüklenir mi?


26

Kalıpları tanımak için filtrelerimi DEM raster üzerinde kontrol etmeye çalışıyorum ve bu her zaman son satır ve sütunların eksik kalmasına neden oluyor (20) . PIL kütüphanesi ile resim yükünü denedim. Sonra da numpy ile. Çıktı aynıdır.

Dizilerdeki değerleri kontrol ederken döngülerimde bir sorun olduğunu düşündüm (ArcCatalog'da Identification ile sadece pikselleri seçerek) Piksel değerlerinin diziye yüklenmediğini fark ettim .

Yani, sadece açmak, diziye koymak ve görüntüyü diziden kaydetmek:

a=numpy.array(Image.open(inraster)) #raster is .tif Float32, size 561x253
newIm=Image.new(Im.mode, Im.size)
Image.fromarray(a).save(outraster)

Son satırları ve sütunları keserek sonuçlanır. Üzgünüz, resmi # t gönderemiyorum

Nedenini anlamada herkes yardımcı olabilir mi? Ve bir çözüm öneriniz var mı?

DÜZENLE:

Bu yüzden, küçük rasterleri numpy dizisine erkeklerin yardımı ile yüklemeyi başardım, ancak daha büyük bir görüntüye sahip olduğumda hataları almaya başladım. Sanırım bu numpy dizisinin limitleri hakkında ve diyelim ki dizi otomatik olarak yeniden şekillendirilmiş veya smth ... Öyleyse:

Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    ima=numpy.array(inDs.GetRasterBand(1).ReadAsArray())
  File "C:\Python25\lib\site-packages\osgeo\gdal.py", line 835, in ReadAsArray
    buf_xsize, buf_ysize, buf_obj )
  File "C:\Python25\lib\site-packages\osgeo\gdal_array.py", line 140, in BandReadAsArray
    ar = numpy.reshape(ar, [buf_ysize,buf_xsize])
  File "C:\Python25\lib\site-packages\numpy\core\fromnumeric.py", line 108, in reshape
    return reshape(newshape, order=order)
ValueError: total size of new array must be unchanged

Mesele şu ki, filtrelemeye ihtiyaç duyduğum blok bloğunu okumak istemiyorum, farklı filtrelerle birkaç kez, farklı boyutlarda .. Etrafta herhangi bir çalışma var mı veya bloklar halinde gölgelemeyi öğrenmeliyim: O

Yanıtlar:


42

python-gdal bağlarınız varsa:

import numpy as np
from osgeo import gdal
ds = gdal.Open("mypic.tif")
myarray = np.array(ds.GetRasterBand(1).ReadAsArray())

Ve bitti:

myarray.shape
(2610,4583)
myarray.size
11961630
myarray
array([[        nan,         nan,         nan, ...,  0.38068664,
     0.37952521,  0.14506227],
   [        nan,         nan,         nan, ...,  0.39791253,
            nan,         nan],
   [        nan,         nan,         nan, ...,         nan,
            nan,         nan],
   ..., 
   [ 0.33243281,  0.33221543,  0.33273876, ...,         nan,
            nan,         nan],
   [ 0.33308044,  0.3337177 ,  0.33416209, ...,         nan,
            nan,         nan],
   [ 0.09213851,  0.09242494,  0.09267616, ...,         nan,
            nan,         nan]], dtype=float32)

Evet, gdal ile sanırım sorunum olmadı, ama daha az kütüphane olarak kullanmaya çalışıyorum ... Ve numpy 'googling' için bunun için çok popüler görünüyordu. Herhangi bir fikir, gerçekten, neden numpy / PIL'in yüklenmeyi durdurduğu ???
najuste 10:12

Bilmiyorum. PIL yeterince sağlam olmalı, böylece python ile gönderilmelidir. Fakat imho geotiff, görüntülerden daha fazlasıdır - örneğin, çok fazla meta veri taşırlar - ve PIL (yine imho) doğru araç değildir.
nickler

Verileri açarken sadece bazen bu farklı fiyat tekliflerinden ve eğik çizgi gereksinimlerinden nefret ediyorum. PIL kütüphanesiyle çalışır, ancak outputRaster.GetRasterBand (1) öğesini kullanarak .WriteArray (myarray) geçersiz raster üretir ..
najuste

outBand.FlushCache () ile verileri diske temizlemeyi unutmayın. Burada bazı dersleri bulabilirsiniz: gis.usu.edu/~chrisg/python/2009
nickves 10:12


21

Sen kullanabilirsiniz rasterio NumPy diziler ile arayüz için. Bir diziye raster okumak için:

import rasterio

with rasterio.open('/path/to/raster.tif', 'r') as ds:
    arr = ds.read()  # read all raster values

print(arr.shape)  # this is a 3D numpy array, with dimensions [band, row, col]

Bu, her şeyi arrboyutlarla birlikte 3B bir numpy dizisine okuyacaktır [band, row, col].


İşte bir piksel okumak, düzenlemek ve ardından tekrar taramaya kaydetmek için gelişmiş bir örnek:

with rasterio.open('/path/to/raster.tif', 'r+') as ds:
    arr = ds.read()  # read all raster values
    arr[0, 10, 20] = 3  # change a pixel value on band 1, row 11, column 21
    ds.write(arr)

Raster "with" ifadesinin sonunda yazılır ve kapatılır .


Baskı yazarken neden tüm değerleri göremiyoruz (arr). Değerleri bununla ayırır ..., ...,?
Mustafa Uçar

@ MustafaUçar, NumPy'nin değiştirebileceğiniz dizileri böyle yazdırmasıdır . Veya diğer birçok Numpy püf noktaları arasında yazdırılacak dizinin bir penceresini dilimleyin.
Mike T

Genel bir soru. Birden fazla sahneye sahip tek bir dizi oluşturmak istersem (sahne, yükseklik, genişlik, bantlar gibi) dört boyut olarak, bu pasajı nasıl değiştirmeliyim?
Ricardo Barros Lourenço,

@ RicardoBarrosLourenço Dördüncü boyutunuzun (sahne?) Her dosyada depolandığını tahmin ediyorum. Önce boş bir 4D numpy dizisi doldururum, sonra her bir dosyaya (sahne) geçip her birinin 3D bölümünü eklerdim. arr.transpose((1, 2, 0))Her dosyadan (yükseklik, genişlik, bantlar) almanız gerekebilir .
Mike T

@MikeT bu popülasyon gibi olur np.append()mu?
Ricardo Barros Lourenço,

3

Düz eski bir png resmi okuyorum ancak bu scipy kullanarak çalışıyor ( imsavePIL kullanıyor olsa da):

>>> import scipy
>>> import numpy
>>> img = scipy.misc.imread("/home/chad/logo.png")
>>> img.shape
(81, 90, 4)
>>> array = numpy.array(img)
>>> len(array)
81
>>> scipy.misc.imsave('/home/chad/logo.png', array)

Benim sonuç png de 81 x 90 pikseldir.


Teşekkürler, ama daha az kütüphane olarak kullanmaya çalışıyorum .. Şimdilik gdal + numpy ile yapabilirim ... (umarım PIL'siz).
najuste

1
@ najuste Hangi işletim sistemi açık? Mac ve çoğu Linux tatlar ile gelen scipyve numpy.
Chad Cooper

Görünüşe göre ... Windows'dayım, Win'in çeşitli versiyonları. : /
najuste

2

Gdal kullanan çözümüm böyle gözüküyor. Bence çok tekrar kullanılabilir.

import gdal
import osgeo.gdalnumeric as gdn

def img_to_array(input_file, dim_ordering="channels_last", dtype='float32'):
    file  = gdal.Open(input_file)
    bands = [file.GetRasterBand(i) for i in range(1, file.RasterCount + 1)]
    arr = np.array([gdn.BandReadAsArray(band) for band in bands]).astype(dtype)
    if dim_ordering=="channels_last":
        arr = np.transpose(arr, [1, 2, 0])  # Reorders dimensions, so that channels are last
    return arr

0

158 bant ile bir hiperspektral görüntü kullanıyorum. Raster hesaplamak istiyorum. ama anladım

import gdal # Import GDAL library bindings
from osgeo.gdalnumeric import *
from osgeo.gdalconst import *
import pylab as plt
import numpy as np
import xlrd
# The file that we shall be using
# Needs to be on current directory
filename = ('C:/Users/KIFF/Desktop/These/data/Hyperion/10th_bandmathref')
outFile = ('C:/Users/KIFF/Desktop/These/data/Hyperion/Math')
XLS=('C:/Users/KIFF/Desktop/These/data/Coef/bcoef.xlsx')
wb = xlrd.open_workbook(XLS)
sheet = wb.sheet_by_index(0)
sheet.cell_value(0, 0)


g = gdal.Open(filename, GA_ReadOnly)

# g should now be a GDAL dataset, but if the file isn't found
# g will be none. Let's test this:
if g is None:
    print ("Problem opening file %s!" % filename)
else:
    print ("File %s opened fine" % filename )

#band_array = g.ReadAsArray()
#print(band_array)
print ("[ RASTER BAND COUNT ]: ", g.RasterCount)

for band in range( g.RasterCount ):
    print (band)
    band += 1
    outFile = ('C:/Users/KIFF/Desktop/These/data/Results/Temp/Math_1_sur_value'+str(band)+'.tiff')
    #print ("[ GETTING BAND ]: ", band )
    srcband = g.GetRasterBand(band)
    if srcband is None:
        continue
    data1 = BandReadAsArray(srcband).astype(np.float)
    print(data1)
   # for i in range(3,sheet.nrows):
    b=sheet.cell_value(band+2,1)
    #print(b)
    dataOut = (1/data1)
    driver = gdal.GetDriverByName("ENVI")
    dsOut = driver.Create(outFile, g.RasterXSize, g.RasterYSize, 1)
    CopyDatasetInfo(g,dsOut)
    bandOut=dsOut.GetRasterBand(1)
    BandWriteArray(bandOut, dataOut)

Çünkü print(data1)ben sadece biraz "1" aldım, fakat gerçek değerler bazı değişkenler.

0
[[1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 ...
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]]
1
[[1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 ...
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]
 [1. 1. 1. ... 1. 1. 1.]]
2

Piksel değeri 0,139200

Plz hatayı bulmak için yardım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.