Mảng và hình ảnh mảng

Mảng trong Earth Engine được tạo từ danh sách số và danh sách danh sách. Mức độ lồng nhau xác định số lượng phương diện. Để bắt đầu với một ví dụ đơn giản, có lý do, hãy xem xét ví dụ sau về Array được tạo từ các hệ số mũ (TC) của Landsat 8 (Baig et al., 2014):

Trình soạn thảo mã (JavaScript)

// Create an Array of Tasseled Cap coefficients.
var coefficients = ee.Array([
  [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872],
  [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608],
  [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559],
  [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773],
  [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085],
  [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252],
]);

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Create an Array of Tasseled Cap coefficients.
coefficients = ee.Array([
    [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872],
    [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608],
    [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559],
    [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773],
    [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085],
    [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252],
])

Xác nhận rằng đây là Mảng 2D 6x6 bằng cách sử dụng length(). Mảng này sẽ trả về độ dài của mỗi trục:

Trình soạn thảo mã (JavaScript)

// Print the dimensions.
print(coefficients.length()); //    [6,6]

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Print the dimensions.
display(coefficients.length())  #    [6,6]

Bảng sau đây minh hoạ cách sắp xếp các mục nhập ma trận dọc theo trục 0 và trục 1:

1 trục ->
012345
00,30290,27860,47330,55990,5080,1872
1-0,2941-0,243-0,54240,72760,0713-0,1608
Trục 020,15110,19730,32830,3407-0,7117-0,4559
3-0,82390,08490,4396-0,0580,2013-0,2773
4-0,32940,05570,10560,1855-0,43490,8085
50,1079-0,90230,41190,0575-0,02590,0252

Các chỉ mục ở bên trái bảng cho biết vị trí dọc theo trục 0. Phần tử thứ n trong mỗi danh sách trên trục 0 nằm ở vị trí thứ n dọc theo trục 1. Ví dụ: mục nhập tại toạ độ [3, 1] của mảng là 0,0849. Giả sử "màu xanh lục" là thành phần TC mà bạn quan tâm. Bạn có thể lấy ma trận phụ màu xanh lục bằng slice():

Trình soạn thảo mã (JavaScript)

// Get the 1x6 greenness slice, display it.
var greenness = coefficients.slice({axis: 0, start: 1, end: 2, step: 1});
print(greenness);

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Get the 1x6 greenness slice, display it.
greenness = coefficients.slice(axis=0, start=1, end=2, step=1)
display(greenness)

Ma trận màu xanh lục 2D sẽ có dạng như sau:

[[-0.2941,-0.243,-0.5424,0.7276,0.0713,-0.1608]]
    

Hãy quan sát rằng các tham số startend của slice() tương ứng với các chỉ mục trục 0 hiển thị trong bảng (start là bao gồm và end là không bao gồm).

Hình ảnh mảng

Để có hình ảnh màu xanh lục, hãy nhân ma trận các dải của hình ảnh Landsat 8 với ma trận màu xanh lục. Để làm việc đó, trước tiên, hãy chuyển đổi hình ảnh Landsat nhiều băng thành "Hình ảnh mảng", trong đó mỗi pixel là một Array của các giá trị băng. Ví dụ:

Trình soạn thảo mã (JavaScript)

// Load a Landsat 8 image, select the bands of interest.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
  .select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7']);

// Make an Array Image, with a 1-D Array per pixel.
var arrayImage1D = image.toArray();

// Make an Array Image with a 2-D Array per pixel, 6x1.
var arrayImage2D = arrayImage1D.toArray(1);

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Load a Landsat 8 image, select the bands of interest.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(
    ['B2', 'B3', 'B4', 'B5', 'B6', 'B7']
)

# Make an Array Image, with a 1-D Array per pixel.
array_image_1d = image.toArray()

# Make an Array Image with a 2-D Array per pixel, 6x1.
array_image_2d = array_image_1d.toArray(1)

Trong ví dụ này, hãy lưu ý rằng toArray() chuyển đổi image thành một hình ảnh mảng, trong đó mỗi pixel là một vectơ 1 chiều, các mục tương ứng với 6 giá trị tại các vị trí tương ứng trong các dải của image. Hình ảnh mảng của các vectơ 1 chiều được tạo theo cách này không có khái niệm về hình dạng 2 chiều. Để thực hiện các thao tác chỉ 2D như nhân ma trận, hãy chuyển đổi thành hình ảnh mảng 2D trên mỗi pixel bằng toArray(1). Trong mỗi pixel của hình ảnh mảng 2D, có một ma trận 6x1 chứa các giá trị băng tần. Để thấy điều này, hãy xem ví dụ sau:

Trình soạn thảo mã (JavaScript)

var array1D = ee.Array([1, 2, 3]);              // [1,2,3]
var array2D = ee.Array.cat([array1D], 1);     // [[1],[2],[3]]

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

array_1d = ee.Array([1, 2, 3])  # [1,2,3]
array_2d = ee.Array.cat([array_1d], 1)  # [[1],[2],[3]]

Quan sát thấy vectơ array1D thay đổi dọc theo trục 0. Ma trận array2D cũng vậy, nhưng có thêm một phương diện. Việc gọi toArray(1) trên hình ảnh mảng cũng giống như gọi cat(bandVector, 1) trên mỗi pixel. Sử dụng hình ảnh mảng 2D, nhân bên trái với một hình ảnh trong đó mỗi pixel chứa một ma trận 2D của hệ số màu xanh lục:

Trình soạn thảo mã (JavaScript)

// Do a matrix multiplication: 1x6 times 6x1.
// Cast the greenness Array to an Image prior to multiplication.
var greennessArrayImage = ee.Image(greenness).matrixMultiply(arrayImage2D);

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Do a matrix multiplication: 1x6 times 6x1.
# Cast the greenness Array to an Image prior to multiplication.
greenness_array_image = ee.Image(greenness).matrixMultiply(array_image_2d)

Kết quả là một hình ảnh mảng mới, trong đó mỗi pixel là một ma trận 1x1, là kết quả của phép nhân ma trận với ma trận màu xanh lục 1x6 (bên trái) và ma trận băng tần 6x1 (bên phải). Để hiển thị, hãy chuyển đổi thành hình ảnh một dải thông thường bằng arrayGet():

Trình soạn thảo mã (JavaScript)

// Get the result from the 1x1 array in each pixel of the 2-D array image.
var greennessImage = greennessArrayImage.arrayGet([0, 0]);

// Display the input imagery with the greenness result.
Map.setCenter(-122.3, 37.562, 10);
Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], min: 0, max: 0.5}, 'image');
Map.addLayer(greennessImage, {min: -0.1, max: 0.13}, 'greenness');

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Get the result from the 1x1 array in each pixel of the 2-D array image.
greenness_image = greenness_array_image.arrayGet([0, 0])

# Display the input imagery with the greenness result.
m = geemap.Map()
m.set_center(-122.3, 37.562, 10)
m.add_layer(image, {'bands': ['B5', 'B4', 'B3'], 'min': 0, 'max': 0.5}, 'image')
m.add_layer(greenness_image, {'min': -0.1, 'max': 0.13}, 'greenness')
m

Dưới đây là một ví dụ hoàn chỉnh, sử dụng toàn bộ mảng hệ số để tính toán nhiều thành phần mũ có tua cùng một lúc và hiển thị kết quả:

Trình soạn thảo mã (JavaScript)

// Define an Array of Tasseled Cap coefficients.
var coefficients = ee.Array([
  [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872],
  [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608],
  [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559],
  [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773],
  [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085],
  [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252],
]);

// Load a Landsat 8 image, select the bands of interest.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318')
  .select(['B2', 'B3', 'B4', 'B5', 'B6', 'B7']);

// Make an Array Image, with a 1-D Array per pixel.
var arrayImage1D = image.toArray();

// Make an Array Image with a 2-D Array per pixel, 6x1.
var arrayImage2D = arrayImage1D.toArray(1);

// Do a matrix multiplication: 6x6 times 6x1.
var componentsImage = ee.Image(coefficients)
  .matrixMultiply(arrayImage2D)
  // Get rid of the extra dimensions.
  .arrayProject([0])
  .arrayFlatten(
    [['brightness', 'greenness', 'wetness', 'fourth', 'fifth', 'sixth']]);

// Display the first three bands of the result and the input imagery.
var vizParams = {
  bands: ['brightness', 'greenness', 'wetness'],
  min: -0.1, max: [0.5, 0.1, 0.1]
};
Map.setCenter(-122.3, 37.562, 10);
Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], min: 0, max: 0.5}, 'image');
Map.addLayer(componentsImage, vizParams, 'components');

Thiết lập Python

Hãy xem trang Môi trường Python để biết thông tin về API Python và cách sử dụng geemap để phát triển tương tác.

import ee
import geemap.core as geemap

Colab (Python)

# Define an Array of Tasseled Cap coefficients.
coefficients = ee.Array([
    [0.3029, 0.2786, 0.4733, 0.5599, 0.508, 0.1872],
    [-0.2941, -0.243, -0.5424, 0.7276, 0.0713, -0.1608],
    [0.1511, 0.1973, 0.3283, 0.3407, -0.7117, -0.4559],
    [-0.8239, 0.0849, 0.4396, -0.058, 0.2013, -0.2773],
    [-0.3294, 0.0557, 0.1056, 0.1855, -0.4349, 0.8085],
    [0.1079, -0.9023, 0.4119, 0.0575, -0.0259, 0.0252],
])

# Load a Landsat 8 image, select the bands of interest.
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(
    ['B2', 'B3', 'B4', 'B5', 'B6', 'B7']
)

# Make an Array Image, with a 1-D Array per pixel.
array_image_1d = image.toArray()

# Make an Array Image with a 2-D Array per pixel, 6x1.
array_image_2d = array_image_1d.toArray(1)

# Do a matrix multiplication: 6x6 times 6x1.
components_image = (
    ee.Image(coefficients)
    .matrixMultiply(array_image_2d)
    # Get rid of the extra dimensions.
    .arrayProject([0])
    .arrayFlatten(
        [['brightness', 'greenness', 'wetness', 'fourth', 'fifth', 'sixth']]
    )
)

# Display the first three bands of the result and the input imagery.
viz_params = {
    'bands': ['brightness', 'greenness', 'wetness'],
    'min': -0.1,
    'max': [0.5, 0.1, 0.1],
}
m = geemap.Map()
m.set_center(-122.3, 37.562, 10)
m.add_layer(image, {'bands': ['B5', 'B4', 'B3'], 'min': 0, 'max': 0.5}, 'image')
m.add_layer(components_image, viz_params, 'components')
m

Xin lưu ý rằng khi lấy các dải từ hình ảnh mảng, trước tiên, hãy loại bỏ các kích thước bổ sung bằng project(), sau đó chuyển đổi hình ảnh đó trở lại thành hình ảnh thông thường bằng arrayFlatten(). Kết quả sẽ có dạng như sau:

hình ảnh chiếc mũ có tua
Hình 1. Các thành phần của mũ có tua "độ sáng" (màu đỏ), "độ xanh lục" (màu xanh lục) và "độ ẩm" (màu xanh dương).