সম্পূর্ণরূপে একটি রাঙানো অ্যারেতে রাস্টার লোড করুন?


26

আমি প্যাটার্ন সনাক্তকরণের জন্য আমার ফিল্টারগুলি ডিইএম রাস্টারগুলিতে চেক করার চেষ্টা করেছি এবং এটি সর্বদা সর্বশেষ সারি এবং কলাম (যেমন..২০) অনুপস্থিত হয় । আমি পিআইএল লাইব্রেরি, চিত্র লোড দিয়ে চেষ্টা করেছি। তারপরে নম্পুটি দিয়ে। আউটপুট একই।

আমি ভেবেছিলাম, আমার লুপগুলির সাথে কিছু ভুল আছে, যখন অ্যারেতে মানগুলি পরীক্ষা করা হয় (কেবল অর্কগ্ল্যাটালগে আইডেন্টিফিকেশন সহ পিক্সেল বাছাই করা) আমি বুঝতে পেরেছিলাম যে পিক্সেল মানগুলি অ্যারেতে লোড করা হয়নি।

সুতরাং, খালি খালি খালি, অ্যারে মধ্যে রাখা এবং অ্যারে থেকে চিত্র সংরক্ষণ:

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

শেষ সারি এবং কলামগুলি কেটে ফেলার ফলাফল। দুঃখিত, ছবিটি পোস্ট করা যাবে না

কেউ বুঝতে সাহায্য করতে পারে কেন? এবং কিছু সমাধান পরামর্শ?

সম্পাদনা করুন:

সুতরাং, আমি ছেলেদের সহায়তায় ছোট ছোট রেস্টারগুলিকে নিম্পার অ্যারেতে লোড করতে সাফল্য পেয়েছি, তবে একটি বড় চিত্র পাওয়ার পরে আমি ত্রুটি পেতে শুরু করি। আমি মনে করি এটি অদ্ভুত অ্যারের সীমা সম্পর্কে, এবং তাই অ্যারেটি স্বয়ংক্রিয়ভাবে পুনরায় আকার দেওয়া হয় বা এর মতো স্মিথ হয় ... সুতরাং প্রাক্তন:

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

মুল বক্তব্যটি হ'ল আমি ব্লক করে ব্লকটি পড়তে চাই না কারণ আমার ফিল্টারিং দরকার, বিভিন্ন ফিল্টার, বিভিন্ন আকারের সাথে কয়েকবার .. আশেপাশে কোনও কাজ আছে বা আমাকে ব্লক দ্বারা রেডিং শিখতে হবে: ও

উত্তর:


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)

হ্যাঁ, জিডিএল দিয়ে আমার ধারণা হয় আমার সমস্যা হয়নি তবে আমি কম গ্রন্থাগার হিসাবে ব্যবহার করার চেষ্টা করছি ... এবং 'গুগলিং' করার সময় আঙ্কুলটি এত জনপ্রিয় বলে মনে হয়েছিল। কোন ধারণা, প্রকৃতপক্ষে, কেন নাম্পি / পিআইএল লোড করা বন্ধ করে দেয় ???
নাজুস্তে

আমি জানি না। পিআইএল যথেষ্ট শক্তিশালী হওয়া উচিত যাতে এটি অজগর দিয়ে চালিত হয়। তবে ইমো জিওটিফ চিত্রগুলির চেয়ে বেশি - এগুলি উদাহরণস্বরূপ প্রচুর মেটাডেটা বহন করে- এবং পিআইএল (আবার ইমো) সঠিক সরঞ্জাম নয়।
nickves

ডেটা খোলার সময় আমি মাঝে মাঝে ঠিক সেই সমস্ত ভিন্ন উদ্ধৃতি এবং স্ল্যাশ প্রয়োজনীয়তাগুলি ঘৃণা করি .. তবে রাস্টারগুলিতে ফিরে ছদ্মবেশ অ্যারে লেখার কী হবে? এটা তোলে PIL লাইব্রেরির সাথে কাজ করে, কিন্তু ব্যবহার outputRaster.GetRasterBand (1) .WriteArray (myarray) অবৈধ রাস্টার উত্পাদন করে ..
najuste

আউটব্যান্ড.ফ্লুশচে () সহ ডিস্কে ডেটা ফ্লাশ করতে ভুলবেন না। আপনি এখানে কিছু টিউটোরিয়াল পেতে পারেন: gis.usu.edu/~chrisg/python/2009
nickves

1
" List.osgeo.org/pipermail/gdal-dev/2010- জানুয়ারি/023309.html " দেখুন - দেখে মনে হচ্ছে আপনি ছুটে গেছেন বা ছত্রভঙ্গ হয়ে গেছেন
nickves

21

NumPy অ্যারেগুলির সাথে ইন্টারফেস করতে আপনি রাস্টেরিও ব্যবহার করতে পারেন । একটি অ্যারেতে একজন রাস্টার পড়তে:

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]

এটি arrমাত্রা সহ সমস্ত কিছু 3D ডিপি অ্যারেতে পড়বে [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)

রাস্টার লেখা হবে এবং "উইথ" স্টেটমেন্টের শেষে বন্ধ হবে ।


আমি মুদ্রণ লিখলে কেন আমরা সমস্ত মান দেখতে পারি না (আরআর)। এটি এর সাথে মানগুলি পৃথক করে ..., ...,?
মোস্তফা উয়ার

@ মোস্তফাউয়ার এইভাবেই NumPy অ্যারে প্রিন্ট করে, যা আপনি সংশোধন করতে পারেন । অথবা অন্যান্য অনেক নম্পি কৌশলগুলির মধ্যে মুদ্রণের জন্য অ্যারের উইন্ডোটি কেটে নিন।
মাইক টি

একটি সাধারণ প্রশ্ন। যদি আমি একাধিক দৃশ্যের সাথে একক অ্যারে আউটপুট করতে চাই, যেমন (দৃশ্য, উচ্চতা, প্রস্থ, ব্যান্ড) এর চার মাত্রা হয়ে আমি কীভাবে এই স্নিপেটটি সংশোধন করব?
রিকার্ডো ব্যারোস

@ রিকার্ডোবারোস লরেনাও আমি অনুমান করছি যে আপনার চতুর্থ মাত্রা (দৃশ্য?) প্রতিটি ফাইলে সংরক্ষিত আছে। আমি প্রথমে একটি ফাঁকা 4D নিম্পের অ্যারে তৈরি করব, তারপরে প্রতিটি ফাইল (দৃশ্য) দিয়ে লুপ করব এবং প্রতিটিটির 3 ডি অংশ সন্নিবেশ করতাম। আপনাকে arr.transpose((1, 2, 0))প্রতিটি ফাইল থেকে (উচ্চতা, প্রস্থ, ব্যান্ড) নেওয়ার প্রয়োজন হতে পারে।
মাইক টি

@ মাইকটি এই জনসংখ্যা যেমন হবে np.append()?
রিকার্ডো ব্যারোস

3

মঞ্জুর করছি আমি একটি সরল পুরানো পিএনজি চিত্রটি পড়ছি, তবে এটি স্কিপি ব্যবহার করে ( imsaveযদিও পিআইএল ব্যবহার করে):

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

আমার ফলাফল পিএনজিও 81 x 90 পিক্সেল।


ধন্যবাদ, তবে আমি কম লাইব্রেরি হিসাবে ব্যবহার করার চেষ্টা করছি .. এবং আপাতত আমি এটি জিডিএল + নম্পি দিয়ে তৈরি করতে পারি ... (আশা করি পিআইএল ছাড়াই)।
নাজুস্তে

1
@ নাজাস্টে কি ওএস চালু আছে? ম্যাক এবং বেশিরভাগ লিনাক্স স্বাদ আসে scipyএবং numpy
চাদ কুপার

স্পষ্টতই ... আমি উইন্ডোজ, উইনের বিভিন্ন সংস্করণে আছি। : /
নাজুসতে

2

Gdal ব্যবহার করে আমার সমাধানটি দেখতে দেখতে এটির মতো লাগে। আমি মনে করি এটি খুব পুনরায় ব্যবহারযোগ্য।

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 সহায়তা করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.