0

My program needs a numpy array for processing, so I convert GEE image into numpy array using this code:

# Define an image.
img1 = ee.Image( 'LANDSAT/LC08/C01/T1_SR/LC08_038029_20180810') \
 .select(['B2','B3','B4', 'B5', 'B6'])
new=img1.toArray().toArray(1)
# Define an area of interest.
aoi = ee.Geometry.Polygon(
 [[[-110.8, 44.7],
 [-110.8, 44.6],
 [-110.6, 44.6],
 [-110.6, 44.7]]], None, False)
# Get 2-d pixel array for AOI - returns feature with 2-D pixel array as property per band.
band_arrs = img1.sampleRectangle(region=aoi)
# Get individual band arrays.
band_arr_b2 = band_arrs.get('B2')
band_arr_b3 = band_arrs.get('B3')
band_arr_b4 = band_arrs.get('B4')
# Transfer the arrays from server to client and cast as np array.
np_arr_b2 = np.array(band_arr_b2.getInfo())
np_arr_b3 = np.array(band_arr_b3.getInfo())
np_arr_b4 = np.array(band_arr_b4.getInfo())
# Expand the dimensions of the images so they can be concatenated into 3-D.
np_arr_b2 = np.expand_dims(np_arr_b2, 2)
np_arr_b3 = np.expand_dims(np_arr_b3, 2)
np_arr_b4 = np.expand_dims(np_arr_b4, 2)
# Stack the individual bands to make a 3-D array.
rgb_img = np.concatenate(( np_arr_b4,np_arr_b3,np_arr_b2), 2)

Now can I go back from numpy array to GEE image?

Vince
20.5k16 gold badges49 silver badges65 bronze badges
asked May 11, 2020 at 5:58
4
  • 1
    I don't think this is possible, at least in any efficient way. You probably need to upload it as a GeoTIFF. Commented May 13, 2020 at 8:50
  • you mean first i have to export it into drive as geotif Commented May 13, 2020 at 9:06
  • I mean, you have to turn your numpy array to a GeoTIFF, uploaded it to Google Cloud Storage, and from there, upload it as an Earth Engine asset. I recall there are some command line tools for helping out with the two upload steps though. Commented May 13, 2020 at 9:15
  • Yes, it's very fiddly. You can of course do the upload manually through the Code Editor too. Commented May 13, 2020 at 9:16

1 Answer 1

0

Here I am uploading code to convert GEE image to array and then again convert that array to GEE image, Instead of Image you can select band to do process with the converted band array and then convert it into the image as you said your requirement.

  • As we have image collection and converted it into an array

    var array = image.toarray();
    
  • sort array by the first band, keeping other bands

  • After converting into an array you can do your required process with the array, as I have done below.

    var axes = { image:0, band:1 }
    var sort = array.arraySlice(axes.band, 0, 1); 
    
  • select bands from index 0 to 1` (NDVI)

    var sorted = array.arraySort(sort);
    
  • take the last image only (MAX value)

  • for the max value sorted

    var length = sorted.arrayLength(axes.image);
    var valuesMax = sorted.arraySlice(axes.image, length.subtract(1), length);
    
  • Now convert that sliced array back to image.

    var max = valuesMax.arrayProject([axes.band]).arrayFlatten([['max', 'time']])
    
Kadir Şahbaz
78.6k57 gold badges260 silver badges407 bronze badges
answered Sep 1, 2021 at 10:34

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.