การตรวจจับขอบ

การตรวจหาขอบใช้ได้กับงานประมวลผลรูปภาพหลากหลาย นอกจากนิวเคลียสการตรวจหาขอบที่อธิบายไว้ใน ส่วนการกรองเชิงซ้อนแล้ว Earth Engine ยังมีอัลกอริทึมการตรวจหาขอบเฉพาะอีกหลายรายการ อัลกอริทึมการตรวจหาขอบของ Canny (Canny 1986) ใช้ตัวกรองแยกกัน 4 ตัวเพื่อระบุขอบแนวทแยง แนวตั้ง และแนวนอน การคํานวณจะดึงค่าอนุพันธ์แรกสําหรับทิศทางแนวนอนและแนวตั้ง และคํานวณขนาดของลําดับชั้น ระบบจะระงับการแสดงผลของเส้นลาดที่มีค่าน้อยกว่า หากต้องการกำจัดสัญญาณรบกวนความถี่สูง ให้กรองรูปภาพด้วย Kernel แบบ Gaussian ล่วงหน้า (ไม่บังคับ) เช่น

เครื่องมือแก้ไขโค้ด (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 จะกำหนดขนาดของ Gradient ขั้นต่ำ และพารามิเตอร์ sigma คือค่าเบี่ยงเบนมาตรฐาน (SD) ของตัวกรองก่อนการกรองแบบกaussian เพื่อนำสัญญาณรบกวนความถี่สูงออก สําหรับการดึงข้อมูลเส้นจากตัวตรวจหาขอบ Earth Engine จะใช้การเปลี่ยนรูปแบบของ Hough (Duda and Hart 1972) ต่อจากตัวอย่างก่อนหน้านี้ ให้ดึงเส้นออกจากตัวตรวจจับ Canny ด้วย

เครื่องมือแก้ไขโค้ด (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() เส้นผ่านจุด 0 หมายถึงพิกเซลที่พิกัดขวา ล่าง หรือขวาล่างตามแนวทแยงมีเครื่องหมายตรงข้าม หากพิกเซลใดพิกเซลหนึ่งมีเครื่องหมายตรงข้าม ระบบจะตั้งค่าพิกเซลปัจจุบันเป็น 1 (จุดตัด 0) มิเช่นนั้น ระบบจะตั้งค่าเป็น 0 หากต้องการตรวจหาขอบ ให้ใช้อัลกอริทึมการข้ามศูนย์กับค่าประมาณของอนุพันธ์ลำดับที่ 2 ของรูปภาพ ตัวอย่างต่อไปนี้แสดงการใช้ zeroCrossing() เพื่อตรวจหาขอบ

เครื่องมือแก้ไขโค้ด (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

การตัดผ่าน 0 ของ SFO
รูปที่ 1 เอาต์พุตการข้ามศูนย์ (สีแดง) ที่มีแถบพานโครมาติกของ Landsat 8 เป็นพื้นหลังสำหรับพื้นที่ใกล้สนามบินซานฟรานซิสโก แคลิฟอร์เนีย (ขวา)