Tích chập

Để thực hiện phép tích chập tuyến tính trên hình ảnh, hãy sử dụng image.convolve(). Đối số duy nhất để tích chập là ee.Kernel được chỉ định bằng một hình dạng và các trọng số trong hạt nhân. Mỗi pixel của hình ảnh do convolve() đầu ra là tổ hợp tuyến tính của các giá trị hạt nhân và các pixel hình ảnh đầu vào được hạt nhân bao phủ. Hạt nhân được áp dụng cho từng dải riêng lẻ. Ví dụ: bạn có thể muốn sử dụng hạt nhân lọc thông thấp (làm mượt) để xoá thông tin tần số cao. Hình sau đây minh hoạ một hạt nhân lọc thông 15x15 được áp dụng cho hình ảnh Landsat 8:

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

// Load and display an image.
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318');
Map.setCenter(-121.9785, 37.8694, 11);
Map.addLayer(image, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'input image');

// Define a boxcar or low-pass kernel.
var boxcar = ee.Kernel.square({
  radius: 7, units: 'pixels', normalize: true
});

// Smooth the image by convolving with the boxcar kernel.
var smooth = image.convolve(boxcar);
Map.addLayer(smooth, {bands: ['B5', 'B4', 'B3'], max: 0.5}, 'smoothed');

Kết quả của phép tích chập với bộ lọc thông thấp sẽ có dạng như Hình 1. Hãy quan sát rằng các đối số cho hạt nhân xác định kích thước và hệ số của hạt nhân. Cụ thể, khi tham số units được đặt thành pixel, tham số radius sẽ chỉ định số pixel từ tâm mà hạt nhân sẽ bao phủ. Nếu bạn đặt normalize thành true, thì các hệ số hạt nhân sẽ cộng lại thành một. Nếu bạn đặt tham số magnitude, các hệ số hạt nhân sẽ được nhân với độ lớn (nếu normalize cũng đúng, các hệ số sẽ cộng lại thành magnitude). Nếu có giá trị âm trong bất kỳ hệ số hạt nhân nào, việc đặt normalize thành đúng sẽ làm cho các hệ số cộng lại bằng 0.

boxcar_sf
Hình 1. Hình ảnh Landsat 8 được tích chập bằng hạt nhân làm mượt. Khu vực Vịnh San Francisco, California, Hoa Kỳ.

Sử dụng các hạt nhân khác để đạt được hiệu ứng xử lý hình ảnh mong muốn. Ví dụ này sử dụng hạt nhân Laplacian để phát hiện cạnh đẳng hướng:

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

// Define a Laplacian, or edge-detection kernel.
var laplacian = ee.Kernel.laplacian8({ normalize: false });

// Apply the edge-detection kernel.
var edgy = image.convolve(laplacian);
Map.addLayer(edgy,
             {bands: ['B5', 'B4', 'B3'], max: 0.5, format: 'png'},
             'edges');

Lưu ý chỉ định định dạng trong tham số trực quan hoá. Earth Engine gửi các ô hiển thị đến Trình soạn thảo mã ở định dạng JPEG để tăng hiệu quả, tuy nhiên, các ô cạnh được gửi ở định dạng PNG để xử lý độ trong suốt của các pixel nằm ngoài ranh giới hình ảnh. Khi có sự gián đoạn hình ảnh, việc đặt định dạng thành PNG sẽ giúp hiển thị nhất quán. Kết quả của việc tích chập với hạt nhân phát hiện cạnh Laplacian sẽ có dạng như Hình 2.

laplacian_sf
Hình 2. Hình ảnh Landsat 8 được tích chập với hạt nhân phát hiện cạnh Laplacian. Khu vực Vịnh San Francisco, California, Hoa Kỳ.

Ngoài ra, còn có các hạt nhân phát hiện cạnh không đẳng hướng (ví dụ: Sobel, Prewitt, Roberts), có thể thay đổi hướng bằng kernel.rotate(). Các hạt nhân lọc thông thấp khác bao gồm hạt nhân Gaussian và hạt nhân có nhiều hình dạng với trọng số đồng nhất. Để tạo hạt nhân có trọng số và hình dạng được xác định tuỳ ý, hãy sử dụng ee.Kernel.fixed(). Ví dụ: mã này tạo một hạt nhân 9x9 gồm các giá trị 1 với một giá trị 0 ở giữa:

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

// Create a list of weights for a 9x9 kernel.
var row = [1, 1, 1, 1, 1, 1, 1, 1, 1];
// The center of the kernel is zero.
var centerRow = [1, 1, 1, 1, 0, 1, 1, 1, 1];
// Assemble a list of lists: the 9x9 kernel weights as a 2-D matrix.
var rows = [row, row, row, row, centerRow, row, row, row, row];
// Create the kernel from the weights.
var kernel = ee.Kernel.fixed(9, 9, rows, -4, -4, false);
print(kernel);