NDVI, Ánh xạ một hàm trên một tập hợp, Ghép ảnh chất lượng cao

Trước đây, bạn đã tìm hiểu cách lấy từng cảnh Landsat bằng cách làm như sau, trong đó l8 và point là các dữ liệu nhập đại diện cho tập hợp Landsat 8 TOA và hình học của khu vực quan tâm:

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

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

Bây giờ, giả sử bạn muốn tính toán hình ảnh Chỉ số thực vật khác biệt chuẩn hoá (NDVI) từ hình ảnh Landsat. Thực vật phản xạ ánh sáng trong phần cận hồng ngoại (NIR) của phổ điện từ và hấp thụ ánh sáng trong phần màu đỏ (Tìm hiểu thêm về độ phản xạ NIR từ thực vật). NDVI sử dụng giá trị này để tạo một giá trị duy nhất phản ánh gần đúng hoạt động quang hợp xảy ra tại một pixel. Công thức tính là (NIR - đỏ) / (NIR + đỏ). Kết quả là một số từ 1 đến -1, trong đó các pixel có hoạt động quang hợp cao sẽ có NDVI cao. Sau đây là một cách để tính NDVI trong Earth Engine:

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

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

Kết quả sẽ có dạng như Hình 8. Xin lưu ý rằng chúng ta sử dụng hàm select() mà bạn đã tìm hiểu trong phần trước về việc tạo mặt nạ để lấy dải NIR và dải màu đỏ, sau đó tính toán NDVI bằng các toán tử toán học hình ảnh mà bạn cũng đã thấy trước đó trong phần về toán học Image. Cuối cùng, hãy hiển thị hình ảnh bằng bảng màu. Ở đây, chúng tôi đã sử dụng tên màu thay vì chuỗi thập lục phân trong bảng màu. (Hãy xem tài liệu tham khảo bên ngoài này về màu CSS để biết thông tin chi tiết.)

Tutorial_api_08_ndvi.png
Hình 8. NDVI cho một cảnh Landsat. Màu xanh dương là NDVI thấp và màu xanh lục là NDVI cao.

Phép toán hiệu chuẩn hoá rất phổ biến trong viễn thám, có một hàm lối tắt trên ee.Image giúp đơn giản hoá mã trong ví dụ trước:

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

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

Ánh xạ một hàm qua một tập hợp

Bây giờ, giả sử bạn muốn thêm NDVI vào mọi hình ảnh trong một tập hợp hình ảnh. Cách thực hiện việc đó trong Earth Engine là map() một hàm trên tập hợp. Đừng nhầm lẫn map() với đối tượng Map. Hàm đầu tiên là một phương thức trên một tập hợp và sử dụng map theo ý nghĩa điện toán song song của việc áp dụng một hàm cho mọi phần tử trong một tập hợp. Hàm này xác định các thao tác sẽ được áp dụng cho mọi phần tử trong tập hợp. Bạn đã thấy một hàm đơn giản trong hướng dẫn về JavaScript, nhưng giờ đây, chúng ta sẽ tạo một hàm có chức năng của Earth Engine. Ví dụ: sao chép mã NDVI trước đó vào một hàm trả về hình ảnh đầu vào có dải NDVI:

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

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

Mã này có thể không hiệu quả trong việc tính toán NDVI cho một hình ảnh, nhưng hàm này có thể được dùng làm đối số cho map() để thêm dải NDVI vào mọi hình ảnh trong tập hợp. Thường thì bạn nên kiểm tra một hàm trên một hình ảnh trước để đảm bảo hàm đó hoạt động như mong đợi. Sau khi kiểm tra hàm trên một hình ảnh riêng lẻ và xác định rằng hàm đó thực hiện đúng chức năng bạn muốn, bạn có thể ánh xạ hàm đó trên tập hợp:

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

var withNDVI = l8.map(addNDVI);

Để xác minh rằng thao tác này thực sự thêm một dải NDVI vào mọi hình ảnh trong tập hợp này, bạn có thể thêm tập hợp withNDVI vào bản đồ và truy vấn một vị trí ngẫu nhiên bằng thẻ Inspector (Trình kiểm tra). Bạn sẽ thấy mỗi hình ảnh trong bộ sưu tập hiện có một dải tên là NDVI.

Tạo ảnh tổng hợp điểm ảnh xanh nhất

Bây giờ, khi đã tạo một tập hợp hình ảnh trong đó mỗi hình ảnh đều có một dải NDVI, chúng ta có thể khám phá một cách mới để tạo ảnh tổng hợp: qualityMosaic(). Bạn có thể nhận thấy sự không liên tục giữa các đường dẫn Landsat, ngay cả trong ảnh tổng hợp pixel trung vị. Một phần lý do có thể là do sự khác biệt về hiện tượng học do hình ảnh trong các đường dẫn liền kề được thu thập vào những thời điểm khác nhau (cụ thể là cách nhau 8 ngày). Một cách để giảm thiểu vấn đề này là cố gắng đặt giá trị pixel trong ảnh tổng hợp từ giai đoạn hình thái học gần giống nhau, ví dụ: thời điểm cây xanh nhất (khi lá cây mọc và quang hợp tích cực). Nếu chúng ta cho phép xác định độ xanh tối đa bằng NDVI tối đa, thì chúng ta có thể sử dụng qualityMosaic() để tạo một ảnh tổng hợp, trong đó mỗi pixel chứa pixel NDVI tối đa trong tập hợp. Giờ đây, bạn có thể sử dụng dải NDVI đã thêm vào tập hợp withNDVI:

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

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

Kết quả của mã này sẽ có dạng như Hình 9. So sánh Hình 9 với ảnh tổng hợp trung vị trong Hình 6, bạn sẽ thấy ảnh tổng hợp điểm ảnh xanh nhất thực sự xanh hơn nhiều. Tuy nhiên, khi kiểm tra kỹ các vùng nước, bạn sẽ thấy một vấn đề khác. Cụ thể, các vùng nước hiện có màu đục. Điều này là do cách hoạt động của phương thức qualityMosaic(): tại mỗi vị trí, toàn bộ chuỗi thời gian được kiểm tra và pixel có giá trị tối đa trong dải NDVI được đặt làm giá trị tổng hợp. Vì NDVI trên mây cao hơn trên nước, nên các vùng nước sẽ có các điểm ảnh mây, trong khi các vùng có thảm thực vật đều có màu xanh lục vì NDVI cao nhất khi thảm thực vật trong điểm ảnh đang quang hợp.

Tutorial_api_09_greenest.png
Hình 9. Ảnh tổng hợp pixel xanh nhất của Landsat 8.

Giờ thì bạn đã biết một số cách để kết hợp và ghép ảnh trong Earth Engine. Bạn có thể tạo ảnh tổng hợp giá trị gần đây, giá trị trung bình hoặc điểm ảnh xanh nhất từ những hình ảnh được lọc theo thời gian và địa điểm hoặc tất cả hình ảnh trong bộ sưu tập. Bạn đã tìm hiểu cách thực hiện các phép tính trên hình ảnh và trích xuất thông tin. Trang tiếp theo trình bày các cách lấy thông tin từ Earth Engine, ví dụ: dưới dạng biểu đồ hoặc tập dữ liệu được xuất sang thư mục Google Drive của bạn.