卷積

如要對圖片執行線性卷積,請使用 image.convolve()。卷積的唯一引數是 ee.Kernel,由核中的形狀和權重指定。convolve() 輸出的圖片每個像素都是核函式值和核函式涵蓋的輸入圖片像素的線性組合。每個頻帶都會個別套用核心。舉例來說,您可能會想使用低通 (平滑) 核,以移除高頻率資訊。以下是將 15x15 低通濾鏡套用至 Landsat 8 圖像的示意圖:

程式碼編輯器 (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');

使用低通濾波器的卷積輸出內容應類似於圖 1。請注意,核心的引數會決定其大小和係數。具體來說,當 units 參數設為像素時,radius 參數會指定核心會涵蓋的中心像素數量。如果將 normalize 設為 true,內核係數的總和會為 1。如果設定 magnitude 參數,核果係數會乘以大小 (如果 normalize 也為 true,係數會加總為 magnitude)。如果任何核果係數中有負值,將 normalize 設為 true 會使係數加總為零。

boxcar_sf
圖 1. 經過平滑核函數處理的 Landsat 8 圖像。美國加州舊金山灣區

使用其他核心,以獲得所需的圖像處理效果。這個範例會使用 Laplacian 核來進行等方性邊緣偵測:

程式碼編輯器 (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');

請注意圖表參數中的格式指定符號。為提高效率,Earth Engine 會以 JPEG 格式將顯示圖塊傳送至程式碼編輯器,但邊緣圖塊會以 PNG 格式傳送,以便處理圖片邊界外像素的透明度。如果產生視覺斷層,將格式設為 PNG 可獲得一致的顯示效果。使用 Laplacian 邊緣偵測核函式進行卷積的結果應如圖 2 所示。

laplacian_sf
圖 2. 使用 Laplacian 邊緣偵測核函式對 Landsat 8 圖像進行卷積。美國加州舊金山灣區

還有各向性邊緣偵測核函式 (例如 Sobel、Prewitt、Roberts),其方向可透過 kernel.rotate() 變更。其他低通核包括高斯核和各種形狀的核,且權重均相同。如要建立具有任意定義權重和形狀的核,請使用 ee.Kernel.fixed()。舉例來說,以下程式碼會建立 9x9 的 1 核,其中包含一個零:

程式碼編輯器 (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);