边缘检测适用于各种图片处理任务。除了 卷积部分中介绍的边缘检测核之外,Earth Engine 中还有多种专用边缘检测算法。Canny 边缘检测算法 (Canny 1986) 使用四个单独的滤镜来识别对角线、垂直和水平边缘。计算会提取水平和垂直方向的第一个导数值,并计算梯度幅度。系统会抑制幅度较小的梯度。如需消除高频噪声,可以选择使用高斯核对图像进行预滤。 例如:
Code Editor (JavaScript)
// Load a Landsat 8 image, select the panchromatic band. var image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318').select('B8'); // Perform Canny edge detection and display the result. var canny = ee.Algorithms.CannyEdgeDetector({ image: image, threshold: 10, sigma: 1 }); Map.setCenter(-122.054, 37.7295, 10); Map.addLayer(canny, {}, 'canny');
请注意,threshold
参数用于确定最小梯度幅度,sigma
参数是用于滤除高频噪声的高斯预滤器的标准差 (SD)。如需从边缘检测器中提取线条,Earth Engine 会实现霍夫转换(Duda and Hart 1972)。继续上一个示例,使用以下代码从 Canny 检测器中提取线条:
Code Editor (JavaScript)
// Perform Hough transform of the Canny result and display. var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100); Map.addLayer(hough, {}, 'hough');
Earth Engine 中的另一种专用算法是 zeroCrossing()
。零点穿越是指右侧、底部或对角线右下角像素符号相反的任何像素。如果其中任何一个像素的符号相反,则当前像素设置为 1(零点穿越);否则,将其设置为零。如需检测边缘,可以将零点穿越算法应用于图片二阶导数的估计值。
以下示例演示了如何使用 zeroCrossing()
进行边缘检测:
Code Editor (JavaScript)
// Load a Landsat 8 image, select the panchromatic band. var image = ee.Image('LANDSAT/LC08/C02/T1/LC08_044034_20140318').select('B8'); Map.addLayer(image, {max: 12000}); // Define a "fat" Gaussian kernel. var fat = ee.Kernel.gaussian({ radius: 3, sigma: 3, units: 'pixels', normalize: true, magnitude: -1 }); // Define a "skinny" Gaussian kernel. var skinny = ee.Kernel.gaussian({ radius: 3, sigma: 1, units: 'pixels', normalize: true, }); // Compute a difference-of-Gaussians (DOG) kernel. var dog = fat.add(skinny); // Compute the zero crossings of the second derivative, display. var zeroXings = image.convolve(dog).zeroCrossing(); Map.setCenter(-122.054, 37.7295, 10); Map.addLayer(zeroXings.selfMask(), {palette: 'FF0000'}, 'zero crossings');
加利福尼亚州旧金山机场附近某个区域的零点穿越输出应如下图 1 所示。
