边缘检测

边缘检测适用于各种图片处理任务。除了 卷积部分中介绍的边缘检测核之外,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 所示。

zero crossings SFO
图 1. 加利福尼亚州旧金山机场附近区域的零点穿越输出(红色)及背景中的 Landsat 8 全色波段(右)。