Kết hợp, che và ghép ảnh

Khi tập hợp hệ số phản xạ TOA Landsat 8 được tải vào một biến có tên là l8, bạn thấy rằng mã sau đây sẽ tạo ra một thành phần có giá trị gần đây:

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

var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var landsat2016 = l8.filterDate('2016-01-01', '2016-12-31');
Map.addLayer(landsat2016, visParams, 'l8 collection');

Một trong những vấn đề với hình ảnh kết hợp này là có quá nhiều mây. Thay vì chỉ lấy pixel cuối cùng trong tập hợp (khi bạn thêm một tập hợp vào bản đồ, Earth Engine sẽ ngầm gọi mosaic() trên tập hợp đó), bạn có thể giảm ImageCollection (Tìm hiểu thêm về cách giảm tập hợp hình ảnh).

Kết hợp với các hàm giảm

Bạn đã được giới thiệu về các hàm giảm để lấy số liệu thống kê trong một vùng hình ảnh. Đó là một sự giảm không gian. Giảm một tập hợp hình ảnh thành một hình ảnh là một quá trình giảm tạm thời khi tập hợp đó biểu thị hình ảnh theo thời gian. Loại Reducer mà bạn sử dụng sẽ xác định cách Earth Engine xử lý các pixel chồng chéo. Landsat 8 ghé thăm cùng một địa điểm trên Trái Đất sau mỗi 16 ngày. Điều đó có nghĩa là trong khoảng thời gian 6 tháng, sẽ có khoảng 12 hình ảnh (và nhiều hơn nữa nếu các cảnh trùng lặp). Mỗi pixel trên bản đồ được lấy từ một nhóm pixel – một pixel từ mỗi hình ảnh trong bộ sưu tập đang hiển thị.

Chỉ cần thêm bộ sưu tập vào bản đồ, bạn sẽ chọn được pixel gần đây nhất – pixel đó là pixel trong hình ảnh mới nhất trong nhóm. Bạn có thể thay đổi hành vi này bằng cách sử dụng các hàm giảm của Earth Engine. Ví dụ: thay vì lấy pixel gần đây nhất từ ngăn xếp, Earth Engine có thể được hướng dẫn chọn giá trị trung bình trong ngăn xếp. Điều này có lợi ích là loại bỏ mây (có giá trị cao) và bóng (có giá trị thấp). Khi một tập hợp hình ảnh được giảm bằng cách sử dụng bộ giảm trung vị, giá trị tổng hợp là trung vị trong mỗi dải tần, theo thời gian. Ví dụ: sử dụng các cảnh Landsat vào năm 2016:

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

// Get the median over time, in each band, in each pixel.
var median = l8.filterDate('2016-01-01', '2016-12-31').median();

// Make a handy variable of visualization parameters.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};

// Display the median composite.
Map.addLayer(median, visParams, 'median');

Điểm mới trong mã này là phương thức median() được áp dụng cho một bộ sưu tập hình ảnh. Giống như các phương thức lọc, đây là một lối tắt cho phương thức reduce() chung hơn trên các tập hợp hình ảnh. Phương thức này lấy ee.Reducer() làm đối số. Xem gói ee.Reducer trong thẻ Docs (Tài liệu) của Trình chỉnh sửa mã để xem danh sách tất cả các hàm giảm của Earth Engine. Khi xem xét một hàm giảm cho một tập hợp hình ảnh, hãy lưu ý rằng đầu ra là một hình ảnh, vì vậy, các hàm giảm có đầu ra không phải là số, ví dụ: hàm giảm histogram hoặc toList, sẽ không hoạt động với một tập hợp hình ảnh.

Tutorial_api_06_median_composite
Hình 6. Hình ảnh tổng hợp trung bình của Landsat 8.

Khi thu nhỏ hình ảnh tổng hợp trung bình, bạn sẽ thấy hình ảnh tương tự như Hình 6. Điều này sẽ trông đẹp hơn đáng kể so với thành phần giá trị gần đây mà bạn đã tạo trước đó. Đến đây, bạn nên xem xét lại những gì đã thực hiện để tạo ra thành phần trung bình đó. Earth Engine đã tải toàn bộ bộ sưu tập Landsat 8 trên lục địa Hoa Kỳ và đã tính toán giá trị trung bình cho từng pixel. Đó là rất nhiều dữ liệu! Tất nhiên, bạn có thể tính toán giá trị trung bình hằng năm bằng cách lọc bộ sưu tập trước, như bạn đã làm trước đây. Vấn đề là nếu bạn phải tải tất cả hình ảnh đó xuống và tạo hình ảnh kết hợp này, thì đó sẽ là một dự án lớn. Với Earth Engine, bạn sẽ nhận được kết quả chỉ trong vài giây!

Tìm hiểu thêm về tính năng kết hợp và ghép ảnh tại đây.

Tạo mặt nạ

Mặc dù hình ảnh tổng hợp trung vị là một điểm cải tiến so với hình ảnh tổng hợp giá trị gần đây, nhưng bạn có thể muốn che các phần của hình ảnh. Việc che các pixel trong hình ảnh sẽ làm cho những pixel đó trong suốt và loại trừ chúng khỏi quá trình phân tích. Mỗi pixel trong mỗi dải tần của hình ảnh đều có một mặt nạ. Những phần có giá trị mặt nạ bằng 0 hoặc thấp hơn sẽ trong suốt. Những đối tượng có mặt nạ là bất kỳ giá trị nào lớn hơn 0 sẽ được hiển thị. Mặt nạ của hình ảnh được đặt bằng cách dùng một lệnh gọi như image1.mask(image2). Lệnh gọi này lấy các giá trị của image2 và biến các giá trị đó thành mặt nạ của image1. Mọi pixel trong image2 có giá trị 0 sẽ được chuyển thành trong suốt trong image1.

Ví dụ: giả sử bạn muốn che tất cả các pixel nước trong ảnh tổng hợp trung bình. Bạn có thể tạo mặt nạ nước bằng cách sử dụng tập dữ liệu được mô tả bởi Hansen và cộng sự (2013) trong danh mục dữ liệu của Earth Engine. (Tìm hiểu thêm về tập dữ liệu Hansen và cộng sự trong hướng dẫn này.) Trong tập dữ liệu này, nước có giá trị là 2, đất có giá trị là 1 và "không có dữ liệu" có giá trị là 0. Sử dụng một chút logic để tạo hình ảnh mặt nạ có các số 0 ở nơi không có đất:

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

// Load or import the Hansen et al. forest change dataset.
var hansenImage = ee.Image('UMD/hansen/global_forest_change_2015');

// Select the land/water mask.
var datamask = hansenImage.select('datamask');

// Create a binary mask.
var mask = datamask.eq(1);

// Update the composite mask with the water mask.
var maskedComposite = median.updateMask(mask);
Map.addLayer(maskedComposite, visParams, 'masked');

Có một vài điểm mới trong mã này mà bạn nên đề cập chi tiết. Trước tiên, hàm select() rất hữu ích để trích xuất các dải tần số cần thiết từ một hình ảnh. Ở đây, chúng ta chỉ chọn băng tần mà chúng ta quan tâm: datamask. Điều mới tiếp theo là toán tử logic eq(), có nghĩa là "bằng". Chúng tôi sử dụng eq(1) để tạo một hình ảnh nhị phân trong đó tất cả các điểm ảnh không có giá trị 1 trong dải datamask (những điểm ảnh là nước hoặc không có dữ liệu) sẽ nhận được giá trị 0 trong hình ảnh kết quả.

Do quá trình che phủ này, tất cả các pixel trong thành phần trung bình nằm trên đất liền (theo tập dữ liệu của Hansen và cộng sự) đều có thể nhìn thấy, nhưng những pixel nằm trên mặt nước (hoặc không có dữ liệu) sẽ trong suốt và sẽ bị loại trừ khỏi mọi hoạt động phân tích mà bạn thực hiện trên hình ảnh maskedComposite.

Ghép ảnh

Bằng cách kết hợp các khái niệm về bộ sưu tập hình ảnh, toán tử logic, che phủ và kết hợp, bạn có thể đạt được kết quả thú vị về bản đồ. Ví dụ: giả sử bạn muốn một hình ảnh trong đó các pixel trên đất được hiển thị bằng màu thực và tất cả các pixel khác được hiển thị bằng màu xanh dương, bạn có thể làm như sau:

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

// Make a water image out of the mask.
var water = mask.not();

// Mask water with itself to mask all the zeros (non-water).
water = water.mask(water);

// Make an image collection of visualization images.
var mosaic = ee.ImageCollection([
  median.visualize(visParams),
  water.visualize({palette: '000044'}),
]).mosaic();

// Display the mosaic.
Map.addLayer(mosaic, {}, 'custom mosaic');

Có rất nhiều việc đang diễn ra trong mã đó, vì vậy, hãy phân tích mã này. Trước tiên, chúng ta sử dụng toán tử logic not() để đảo ngược mặt nạ mà chúng ta đã tạo trước đó. Cụ thể, not() sẽ chuyển tất cả các số 0 thành số 1 và tất cả các số khác 0 thành số 0. Việc gọi biến đó là water không hoàn toàn chính xác vì biến này cũng bao gồm một số pixel không có dữ liệu, nhưng điều này không sao trong bối cảnh lập bản đồ hiện tại. Việc tiếp theo là che "nước" bằng chính nó. Điều này dẫn đến một hình ảnh trong đó tất cả các pixel nước đều là 1 và mọi thứ khác đều được che. Bước cuối cùng là kết hợp các hình ảnh với mosaic(). Vì mosaic() hoạt động trên một bộ sưu tập hình ảnh, nên chúng ta sẽ truyền một danh sách hình ảnh mà chúng ta muốn kết hợp vào hàm dựng bộ sưu tập hình ảnh, sau đó gọi mosaic() làm bước cuối cùng. Thứ tự của các hình ảnh trong danh sách đó là rất quan trọng. Cụ thể, hình ảnh đầu ra sẽ chứa pixel chưa được che phủ cuối cùng trong ngăn xếp hình ảnh trong tập hợp đầu vào. Trong trường hợp này, điều đó có hiệu quả vì lớp nước là hình ảnh cuối cùng (trên cùng) trong bộ sưu tập và chỉ chứa các pixel chưa được che phủ ở nơi có nước.

Xin lưu ý rằng hình ảnh trong bộ sưu tập là hình ảnh trực quan. Khi bạn gọi visualize() trên một hình ảnh, hình ảnh đó sẽ được chuyển thành hình ảnh 3 dải tần, 8 bit theo các tham số trực quan hoá mà bạn truyền vào. Các thông số trực quan hoá mặc định hoạt động tốt đối với hình ảnh 3 băng tần, 8 bit, vì vậy, bạn không cần thông số trực quan hoá khi thêm hình ảnh vào bản đồ. Kết quả sẽ có dạng như Hình 7.

Tutorial_api_07_mosaic.png
Hình 7. Khảm tuỳ chỉnh giúp các vùng nước có màu đồng nhất.

Đến đây, bạn đã thấy các cách để trực quan hoá bộ sưu tập hình ảnh dưới dạng các thành phần gần đây, các phương thức để kết hợp bộ sưu tập hình ảnh bằng cách sử dụng các hàm giảm và các phương thức để tạo thành phần tuỳ chỉnh bằng cách che và ghép một bộ sưu tập hình ảnh. Trong trang tiếp theo, hãy tìm hiểu cách thêm chỉ số thực vật vào mọi hình ảnh trong một tập hợp và sử dụng chỉ số này để tạo một thành phần "pixel xanh nhất".