पूरी तरह से एक संख्यात्मक सरणी में रेखापुंज लोड?


26

मैं पैटर्न मान्यता के लिए डीईएम रेखापुंज पर अपने फिल्टर की जांच करने की कोशिश कर रहा हूं और यह हमेशा अंतिम पंक्तियों और स्तंभों को याद करने के परिणामस्वरूप होता है (जैसे कि..20) । मैंने पीआईएल लाइब्रेरी, इमेज लोड के साथ कोशिश की है। फिर सुन्न के साथ। आउटपुट एक ही है।

मैंने सोचा, मेरे छोरों के साथ कुछ गलत है, जब सरणी में मानों की जाँच कर रहा है (आर्ककॉस्टिक्स में पहचान के साथ सिर्फ पिक्सेल उठाते हुए) मुझे एहसास हुआ कि पिक्सेल मूल्यों को एक सरणी में लोड नहीं किया गया था।

इसलिए, बस केवल खोलना, सरणी में डालना और छवि को सरणी से बचाना:

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

अंतिम पंक्तियों और स्तंभों को काटने में परिणाम। क्षमा करें, छवि को # पोस्ट नहीं कर सकता

कोई भी यह समझने में मदद कर सकता है कि क्यों? और कुछ समाधान की सलाह दें?

संपादित करें:

इसलिए, मैंने लोगों की मदद से छोटे चीरों को सुपीरियर सरणी में लोड करने में कामयाबी हासिल की, लेकिन बड़ी छवि होने पर मुझे त्रुटियां होने लगती हैं। मुझे लगता है कि यह सुन्न सरणी की सीमाओं के बारे में है, और इसलिए सरणी स्वचालित रूप से आकार में है या इस तरह से smth है ... तो पूर्व:

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

मुद्दा यह है कि मैं ब्लॉक को ब्लॉक करके पढ़ना नहीं चाहता क्योंकि मुझे फ़िल्टरिंग की आवश्यकता है, कई बार अलग-अलग फिल्टर, विभिन्न आकारों के साथ .. क्या कोई काम है या मुझे ब्लॉक द्वारा रीडिंग सीखना होगा: O

जवाबों:


42

यदि आपके पास अजगर-गदल बाइंडिंग है:

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

और आपने कल लिया:

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)

हाँ, गदल के साथ मुझे लगता है कि मुझे कोई समस्या नहीं थी, लेकिन मैं कम पुस्तकालयों के रूप में उपयोग करने की कोशिश कर रहा हूं ... और 'गूग्लिंग करते समय' के लिए बहुत लोकप्रिय लग रहा था। कोई भी विचार, वास्तव में, क्यों सुन्न / पीआईएल लोड करना बंद कर देता है ???
नजस्टी

मुझे नहीं पता। पीआईएल पर्याप्त रूप से मजबूत होना चाहिए ताकि अजगर के साथ भेज दिया जाए। लेकिन imho geotiff छवियों की तुलना में अधिक हैं - वे उदाहरण के लिए बहुत सारे मेटाडेटा ले जाते हैं- और PIL सही उपकरण नहीं है (फिर से imho)।
निकलता है

मुझे कभी-कभी डेटा खोलने के दौरान उन अलग-अलग उद्धरण और स्लेश आवश्यकताओं से घृणा होती है .. लेकिन रैस्टर को वापस सुन्न लिखने के बारे में क्या? यह पीआईएल पुस्तकालय के साथ काम करता है, लेकिन outputRaster.GetRasterBand (1) का उपयोग करके ।WriteArray (myarray) अवैध रेखापुंज का उत्पादन करता है ..
najuste

डिस्क से डेटा को फ्लश करना न भूलें, आउटबंड के साथ। फ़्लश कैशे ()। आप यहाँ कुछ ट्यूटोरियल पा सकते हैं: gis.usu.edu/~chrisg/python/2009
21

1
" Lists.osgeo.org/pipermail/gdal-dev/2010-January/023309.html " चेक करें - ऐसा लगता है कि आप भाग गए हैं या राम।
निकलता है

21

आप उपयोग कर सकते हैं NumPy सरणियों के साथ इंटरफ़ेस करने के rasterio का। सरणी के लिए रेखापुंज पढ़ने के लिए:

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]

यह सब कुछ 3 डी संख्यात्मक सरणी में पढ़ेगा arr आयामों के साथ[band, row, col]


यहाँ एक उन्नत उदाहरण पढ़ा गया है, एक पिक्सेल संपादित करें, फिर इसे रेखापुंज में सहेजें:

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)

"के साथ" बयान के अंत में रेखापुंज लिखा और बंद किया जाएगा ।


जब मैं प्रिंट (गिरफ्तारी) लिखता हूं तो हम सभी मान क्यों नहीं देख सकते हैं। यह इसके साथ मूल्यों को अलग करता है ..., ...,?
मुस्तफा उकार

@ MustafaUçar यह है कि NumPy सरणियों को कैसे प्रिंट करता है, जिसे आप संशोधित कर सकते हैं । या कई अन्य Numpy ट्रिक के बीच, प्रिंट करने के लिए सरणी की एक विंडो को स्लाइस करें।
माइक टी

एक सामान्य प्रश्न। यदि मैं चार दृश्यों (दृश्य, ऊंचाई, चौड़ाई, बैंड) के रूप में कई दृश्यों के साथ एक एकल सरणी का उत्पादन करना चाहता हूं, तो मुझे इस स्निपेट को कैसे संशोधित करना चाहिए?
रिकार्डो बारोस लोरेंको

@ RicardoBarrosLourenço मैं आपके चौथे आयाम (दृश्य?) का अनुमान लगा रहा हूं जो प्रत्येक फ़ाइल में संग्रहीत है। मैं सबसे पहले एक खाली 4D अंक को खाली करूँगा, फिर प्रत्येक फ़ाइल (दृश्य) के माध्यम से लूप करूँगा और प्रत्येक के 3 डी हिस्से को सम्मिलित करूँगा। आपको arr.transpose((1, 2, 0))प्रत्येक फ़ाइल से (ऊँचाई, चौड़ाई, बैंड) प्राप्त करने की आवश्यकता हो सकती है ।
माइक टी

@ इस जनसंख्या के रूप में इस तरह होगा np.append()?
रिकार्डो बैरोस लोरेनको

3

दी, मैं एक सादे पुरानी png छवि पढ़ रहा हूँ, लेकिन यह scipy का उपयोग करके काम करता है ( imsaveहालांकि PIL का उपयोग करता है):

>>> 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)

मेरा परिणामी png भी 81 x 90 पिक्सेल है।


धन्यवाद, लेकिन मैं कम पुस्तकालयों के रूप में उपयोग करने की कोशिश कर रहा हूँ .. और अब के लिए मैं इसे gdal + numpy के साथ बना सकता हूं ... (उम्मीद के बिना जीआईएल)।
नजस्टी

1
@najuste OS क्या है? मैक और अधिकांश लिनक्स फ्लेवर के साथ आते हैं scipyऔर numpy
चाड कूपर

जाहिर है ... मैं विंडोज पर हूं, विन के विभिन्न संस्करण। : /
नजस्टी

2

गदल का उपयोग करने का मेरा समाधान इस तरह दिखता है। मुझे लगता है कि यह बहुत ही पुन: प्रयोज्य है।

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 बैंड के साथ एक हाइपरस्पेक्ट्रल छवि का उपयोग कर रहा हूं। मैं रेखापुंज की गणना करना चाहता हूं। लेकिन मुझे मिलता है

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)

क्योंकि print(data1)मुझे केवल कुछ "1" मिला, लेकिन असली मूल्य कुछ तैरने वाले हैं

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

पिक्सेल मान 0,139200

Plz गलती खोजने में मदद करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.