Verwenden Sie image.convolve()
, um lineare Convolutionen auf Bildern durchzuführen. Das einzige Argument für die Convolution ist ein ee.Kernel
, das durch eine Form und die Gewichte im Kernel angegeben wird. Jedes Pixel des von convolve()
ausgegebene Bilds ist die lineare Kombination der Kernelwerte und der vom Kernel abgedeckten Pixel des Eingabebilds. Die Kernel werden einzeln auf jede Bandbreite angewendet. So können Sie beispielsweise einen Tiefpass-Kernel (Glättungskern) verwenden, um hochfrequente Informationen zu entfernen. Die folgende Abbildung zeigt einen 15 × 15-Pixel-Gauss-Filter, der auf ein Landsat 8-Bild angewendet wurde:
Code-Editor (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');
Die Ausgabe der Faltungsoperation mit dem Tiefpassfilter sollte in etwa so aussehen wie in Abbildung 1. Die Größe und die Koeffizienten des Kernels werden durch die Argumente bestimmt.
Wenn der Parameter units
auf „Pixel“ festgelegt ist, gibt der Parameter radius
die Anzahl der Pixel vom Zentrum aus an, die der Kernel abdeckt. Wenn normalize
auf „wahr“ gesetzt ist, summieren sich die Kernelkoeffizienten zu eins. Wenn der Parameter magnitude
festgelegt ist, werden die Kernelkoeffizienten mit der Größe multipliziert. Wenn auch normalize
auf „wahr“ gesetzt ist, ergibt sich durch Addition der Koeffizienten magnitude
. Wenn einer der Kernelkoeffizienten einen negativen Wert hat, ergibt sich durch Festlegen von normalize
auf „wahr“ eine Summe von null.
Verwenden Sie andere Kernel, um den gewünschten Bildverarbeitungseffekt zu erzielen. In diesem Beispiel wird ein Laplacian-Kern für die isotrope Kantenerkennung verwendet:
Code-Editor (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');
Beachten Sie den Formatbezeichner in den Visualisierungsparametern. Earth Engine sendet Darstellungskacheln aus Effizienzgründen im JPEG-Format an den Code-Editor. Randkacheln werden jedoch im PNG-Format gesendet, um die Transparenz von Pixeln außerhalb der Bildgrenzen zu steuern. Wenn es zu einer visuellen Unterbrechung kommt, führt das Festlegen des Formats auf PNG zu einer einheitlichen Darstellung. Das Ergebnis der Convolution mit dem Laplacian-Kerne zur Kantenerkennung sollte in etwa so aussehen wie in Abbildung 2.
Es gibt auch anisotrope Kantenerkennungskerne (z.B. Sobel, Prewitt, Roberts), deren Richtung mit kernel.rotate()
geändert werden kann. Andere Lowpass-Kerne sind ein Gaußscher Kern und Kerne verschiedener Form mit einheitlichen Gewichten. Verwenden Sie ee.Kernel.fixed()
, um Kernel mit beliebig definierten Gewichten und Formen zu erstellen. Mit diesem Code wird beispielsweise ein 9 × 9 Pixel großer Kern aus Einsen mit einer Null in der Mitte erstellt:
Code-Editor (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);