当前位置: 首页 > article >正文

GEE:Sobel算子卷积

作者:CSDN @ _养乐多_

本文将深入探讨边缘检测中的一个经典算法,即Sobel算子卷积。我们将介绍该算法的基本原理,并演示如何在Google Earth Engine中应用Sobel算子进行图像卷积操作。并以试验区NDVI为例子,研究区真彩色影像、NDVI图像以及Sobel卷积结果如下所示,

在这里插入图片描述


文章目录

      • 一、Sobel算子卷积
      • 二、完整代码
      • 三、代码链接


一、Sobel算子卷积

Sobel算子卷积的卷积核如下所示,详细介绍介绍参考《遥感数字图像处理教程(第三版),韦玉春,汤国安…》。

            [0, 0, 24, 24, 0, 0, 0],
            [0, 0, 24, 24, 0, 0, 0],
            [0, 0, 24, 24, 0, 0, 0],
            [0, 0, 24, 24, 24, 24, 24],
            [0, 0, 24, 24, 24, 24, 24],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]

函数详解请看博客《GEE:梯度卷积》。

二、完整代码

// 设置感兴趣区域(ROI)并可视化
var roi = geometry; // 定义感兴趣区域
var roiImage = ee.Image().toByte().paint({ featureCollection: roi, color: 'red', width: 1 });
Map.addLayer(roiImage, { palette: 'red' }, '感兴趣区域'); // 在地图上添加感兴趣区域图层
Map.centerObject(roi, 11); // 将地图中心设置为感兴趣区域的中心位置

// 获取LANDSAT遥感影像数据集
var dataset = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')
    .filterDate('2022-01-01', '2022-12-31'); // 筛选日期范围

// 应用缩放因子
function applyScaleFactors(image) {
    var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2); // 光学波段缩放
    var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0); // 热红外波段缩放
    return image.addBands(opticalBands, null, true)
        .addBands(thermalBands, null, true);
}

dataset = dataset.map(applyScaleFactors);

// 从数据集中选择波段创建影像
var imageYLD = dataset.select(['SR_B5', 'SR_B4', 'SR_B3', 'SR_B2'])
    .filterBounds(roi).median()
    .clip(roi);

// 可视化真彩色影像
var visualization = {
    bands: ['SR_B4', 'SR_B3', 'SR_B2'],
    min: 0.0,
    max: 0.3,
};

Map.addLayer(imageYLD, visualization, '真彩色 (432)');

// 计算归一化植被指数(NDVI)
var ndvi = imageYLD.normalizedDifference(['SR_B5', 'SR_B4']);
var visParam = {
    palette:
        'FFFFFF, CE7E45, DF923D, F1B555, FCD163, 99B718, 74A901, 66A000, 529400,' +
        '3E8601, 207401, 056201, 004C00, 023B01, 012E01, 011D01, 011301'
};
Map.addLayer(ndvi, visParam, 'NDVI');

// 定义滤波窗口大小
var windowSize = 3;

// Roberts算子卷积函数
function RobertsConvolve(image) {
  
    var Roberts_Kernel = ee.Kernel.fixed(7, 7,
        [
            [0, 0, 12, 0, 0, 0, 0],
            [0, 0, 12, 0, 0, 0, 0],
            [0, 0, 12, 0, 0, 0, 0],
            [0, 0, 12, 12, 12, 12, 12],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
        ]); // 定义Roberts算子卷积核

    return image.convolve(Roberts_Kernel);
};

// 应用Roberts算子卷积
var convolvedRobertsImage = RobertsConvolve(ndvi);

// 定义自适应可视化函数
function adaptiveVisualization(image, layerName, roi, visualSwitch, scale, palette) {
  
    // 计算影像的最小值和最大值
    var imageMin = image.reduceRegion({
        reducer: ee.Reducer.min(),
        geometry: roi,
        scale: scale,
        crs: "EPSG:4326",
        bestEffort: true,
        tileScale: 5
    });

    var imageMax = image.reduceRegion({
        reducer: ee.Reducer.max(),
        geometry: roi,
        scale: scale,
        crs: "EPSG:4326",
        bestEffort: true,
        tileScale: 5
    });

    // 打印最小值和最大值
    // print(imageMin, imageMax);

    // 影像可视化
    var viz = {
        palette: palette,
        min: imageMin.getNumber('nd').getInfo(),
        max: imageMax.getNumber('nd').getInfo()
    };
    Map.addLayer(image, viz, layerName, visualSwitch);
}

// 使用自适应可视化函数
adaptiveVisualization(convolvedRobertsImage, 'Roberts', roi, false, 30, ['black', 'blue', 'purple', 'cyan', 'green', 'yellow', 'red']);

// Sobel算子卷积函数
function SobelConvolve(image) {
  
    var Sobel_Kernel = ee.Kernel.fixed(7, 7,
        [
            [0, 0, 24, 24, 0, 0, 0],
            [0, 0, 24, 24, 0, 0, 0],
            [0, 0, 24, 24, 0, 0, 0],
            [0, 0, 24, 24, 24, 24, 24],
            [0, 0, 24, 24, 24, 24, 24],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]
        ]); // 定义Sobel算子卷积核

    return image.convolve(Sobel_Kernel);
};

// 应用Roberts算子卷积
var convolvedSobelImage = SobelConvolve(ndvi);

// 使用自适应可视化函数
adaptiveVisualization(convolvedSobelImage, 'Sobel', roi, true, 30, ['black', 'blue', 'purple', 'cyan', 'green', 'yellow', 'red']);

三、代码链接

https://code.earthengine.google.com/eabd1fa0a43348b17f47fbcc11f4ff1a?noload=true

声明:
本人作为一名作者,非常重视自己的作品和知识产权。在此声明,本人的所有原创文章均受版权法保护,未经本人授权,任何人不得擅自公开发布。
本人的文章已经在一些知名平台进行了付费发布,希望各位读者能够尊重知识产权,不要进行侵权行为。任何未经本人授权而将付费文章免费或者付费(包含商用)发布在互联网上的行为,都将视为侵犯本人的版权,本人保留追究法律责任的权利。
谢谢各位读者对本人文章的关注和支持!


http://www.kler.cn/news/156605.html

相关文章:

  • 第三届首都高校“青春智慧”新铁人三项公开赛圆满落幕
  • .NET8 依赖注入
  • docker搭建nginx实现负载均衡
  • Vue 或者 React 中,什么情况下会用 Es6 的 Class 类
  • 计算机基础知识63
  • AC自动机
  • 2024版软件测试面试100问(答案+文档)
  • 【苍穹外卖】——第一天
  • Docker快速入门(docker加速,镜像,容器,数据卷常见命令操作整理)
  • 基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测
  • 如何进行卷积特征可视化
  • 解锁网络速度的利器:CDN加速技术探析
  • Docker 安装部署 Sentinel Dashboard
  • 内存是如何工作的
  • (5h)Unity3D快速入门之Roll-A-Ball游戏开发
  • Python——import和from import方法总结
  • Linux进程通信——内存映射mmap
  • 搜索引擎高级用法总结: 谷歌、百度、必应
  • C 语言-结构体
  • Android 各平台推送通知栏点击处理方案
  • Kubernetes实战(六)-多系统架构容器镜像构建实战
  • 深入理解JVM内存空间的担保策略
  • 安卓1.0明显是基于linux内核开发的,安卓1.0是不是linux套壳?
  • 用Python实现石头剪刀布的游戏(扩展)
  • eNSP实验
  • 【unity3D】unity中如何查找和获取游戏物体
  • MQTT协议理解并实践
  • vmware_ubuntu_双向拷贝问题
  • 大数据技术发展
  • spring mvc理解