Phát hiện cạnh có thể áp dụng cho nhiều tác vụ xử lý hình ảnh. Ngoài các hạt nhân phát hiện cạnh được mô tả trong phần tích chập, còn có một số thuật toán phát hiện cạnh chuyên biệt trong Earth Engine. Thuật toán phát hiện cạnh Canny (Canny 1986) sử dụng 4 bộ lọc riêng biệt để xác định các cạnh chéo, dọc và ngang. Tính toán này trích xuất giá trị đạo hàm đầu tiên cho hướng ngang và dọc, đồng thời tính toán độ lớn của độ dốc. Các độ dốc có cường độ nhỏ hơn sẽ bị loại bỏ. Để loại bỏ nhiễu tần số cao, bạn có thể lọc trước hình ảnh bằng hạt nhân Gaussian (không bắt buộc). Ví dụ:
Trình soạn thảo mã (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');
Xin lưu ý rằng tham số threshold
xác định độ lớn của độ dốc tối thiểu và tham số sigma
là độ lệch chuẩn (SD) của bộ lọc trước Gaussian để loại bỏ nhiễu tần số cao. Để trích xuất đường kẻ từ một trình phát hiện cạnh, Earth Engine triển khai phép biến đổi Hough (Duda và Hart 1972). Tiếp tục ví dụ trước, hãy trích xuất các đường từ trình phát hiện Canny bằng:
Trình soạn thảo mã (JavaScript)
// Perform Hough transform of the Canny result and display. var hough = ee.Algorithms.HoughTransform(canny, 256, 600, 100); Map.addLayer(hough, {}, 'hough');
Một thuật toán chuyên biệt khác trong Earth Engine là zeroCrossing()
. Điểm giao với giá trị 0 được xác định là bất kỳ pixel nào có pixel bên phải, bên dưới hoặc đường chéo bên dưới cùng bên phải có dấu đối diện. Nếu bất kỳ pixel nào trong số này có dấu đối diện, pixel hiện tại sẽ được đặt thành 1 (đi qua điểm 0); nếu không, pixel đó sẽ được đặt thành 0. Để phát hiện cạnh, bạn có thể áp dụng thuật toán điểm giao với giá trị 0 cho giá trị ước tính của đạo hàm thứ hai của hình ảnh.
Phần sau đây minh hoạ cách sử dụng zeroCrossing()
để phát hiện cạnh:
Trình soạn thảo mã (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');
Kết quả về số lần giao nhau với giá trị 0 cho một khu vực gần sân bay San Francisco, California sẽ có dạng như Hình 1.
