GEE:Sobel算子卷积

news2025/3/3 18:41:28

作者: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]

二、完整代码

// 设置感兴趣区域(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.coloradmin.cn/o/1279699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python毕业设计论文选题管理系统b615y

毕业论文管理方式效率低下,为了提高效率,特开发了本毕业论文管理系统。本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分,具体功能分析如下: (1)导师功能模块:…

站群优化工具,站群优化方案策略

站群优化,作为网络推广的一项重要策略,站群的构建和优化对于提升网站在搜索引擎中的排名、吸引目标流量、增加用户粘性等方面有着不可忽视的作用。 站群优化方案 站群优化并非简单的堆积大量网站,更要注重质量和策略。在构建站群时&#xff…

大数据技术之Flume(超级详细)

大数据技术之Flume(超级详细) 第1章 概述 1.1 Flume定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。 1.2 Flume组成架构 Flume组成架构如…

WPF绘图---Canvas中Polygon屏幕居中显示

问题描述 在一个Canvas中绘制了多个Polygon&#xff0c;由于坐标可能超出界面显示范围&#xff0c;需要将绘制的Polygon居中显示&#xff0c;并且缩放至界面大小&#xff0c;效果如下&#xff1a; xaml代码 <Borderx:Name"border"Background"#fff"Cli…

三个写法统计整数前导0个数

从键盘输入一个整数(可能有前导0)&#xff0c;编程统计其前导0个数&#xff0c;其法有三。 (笔记模板由python脚本于2023年12月03日 12:32:32创建&#xff0c;本篇笔记适合对python整型int和字符型str熟悉的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…

C++17中的结构化绑定

C17中的结构化绑定(structured binding):将指定名称绑定到初始化程序的子对象或元素。简而言之&#xff0c;它们使我们能够从元组或结构中声明多个变量。与引用一样&#xff0c;结构化绑定是现有对象的别名&#xff1b;与引用不同&#xff0c;结构化绑定不必是引用类型(referen…

华天动力-OA8000 MyHttpServlet 文件上传漏洞复现

0x01 产品简介 华天动力OA是一款将先进的管理思想、 管理模式和软件技术、网络技术相结合&#xff0c;为用户提供了低成本、 高效能的协同办公和管理平台。 0x02 漏洞概述 华天动力OA MyHttpServlet 存在任意文件上传漏洞&#xff0c;未经身份认证的攻击者可上传恶意的raq文件…

图片处理OpenCV IMDecode模式说明【生产问题处理】

OpenCV IMDecode模式说明【生产问题处理】 1 前言 今天售后同事反馈说客户使用我们的图片处理&#xff0c;将PNG图片处理为JPG图片之后&#xff0c;变为了白板。 我们图片处理使用的是openCV来进行处理 2 分析 2.1 图片是否损坏&#xff1a;非标准PNG头部 于是&#xff0c;马…

Git中如何按日期进行checkout

Git的checkout命令 在Git中&#xff0c;checkout命令是常用的操作之一。它允许我们切换到不同的分支或指定的提交。通过checkout命令&#xff0c;我们可以在代码库中切换到特定的提交版本&#xff0c;这也意味着我们可以按日期进行checkout。 按日期进行checkout的方法 要按…

SmartSoftHelp8,C#简易编程,测试工具

using System; using System.Data; using System.Drawing; using System.IO; using System.Text; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; /// <summary> /// 编程实验室空间名称 /// </summary> namespa…

边缘与云或边缘加云:前进的方向是什么?

边缘计算使数据处理更接近数据源&#xff0c;以及由此产生的行动或决策的对象。通过设计&#xff0c;它可以改变数十亿物联网和其他设备存储、处理、分析和通信数据的方式。 边缘计算使数据处理更接近数据源&#xff0c;以及由此产生的行动或决策的对象。这与传统的体系结构形成…

局域网传输神器LocalSend

局域网文件传输神器 LocalSend 注意只能在相同局域网用才能使用&#xff08;比如用同一个wifi&#xff09;&#xff0c;通常作为办公用品 安装包下载 在gitHub&#xff0c;最好科学上网一下 LocalSend官网 选择最后更新版本 选择手机或电脑以及自己的系统 安装使用 傻瓜…

Leetcode—1423.可获得的最大点数【中等】

2023每日刷题&#xff08;四十八&#xff09; Leetcode—1423.可获得的最大点数 思路&#xff1a;逆向求长为 n−k 的连续子数组和的最小值 参考灵茶山艾府题解 实现代码 class Solution { public:int maxScore(vector<int>& cardPoints, int k) {int mins 0, …

非标设计之螺纹螺丝选型二

目录 一、螺丝的表面处理工艺&#xff1a;镀锌工艺&#xff1a;渗锌工艺&#xff1a;热浸锌工艺&#xff1a;达克罗工艺&#xff1a;镀镍工艺&#xff1a;氧化&#xff08;发黑&#xff09;工艺&#xff1a;电泳黑工艺&#xff1a;不锈钢螺钉&#xff1a; 二、按照颜色分工艺&a…

TensorRT之LeNet5部署(onnx方式)

文章目录 前言LeNet-5部署1.ONNX文件导出2.TensorRT构建阶段(TensorRT模型文件)&#x1f9c1;创建Builder&#x1f367;创建Network&#x1f36d;使用onnxparser构建网络&#x1f36c;优化网络&#x1f361;序列化模型&#x1f369;释放资源 3.TensorRT运行时阶段(推理)&#x…

SVN下载使用和说明

一、SVN <1>SVN的简介 1、svn是什么&#xff1f; 2、作用 3、基本操作 <2>服务器端的软件下载和安装 1、下载 2、查看环境变量 3、验证安装是否成功 <3>创建项目版本库 1、创建项目版本库&#xff08;svn reponsitory&#xff09; 2、svn版本控制文件说明…

WebGL笔记:矩阵旋转运算的原理和实现

矩阵 矩阵&#xff08;Matrix&#xff09;是一个按照矩形纵横排列的复数集合 矩阵就像一个矩形的阵盘&#xff0c;通过其中纵横排列的元素我们可以摆出不同功能的阵法&#xff0c;比如位移矩阵、旋转矩阵、缩放矩阵 …在矩阵中的每一行&#xff0c;或者每一列数字构成的集合&a…

C语言——指针(四)

&#x1f4dd;前言&#xff1a; 上篇文章C语言——指针&#xff08;三&#xff09;对指针和数组进行了讲解&#xff0c;今天主要更深入的讲解一下不同类型指针变量的特点&#xff1a; 1&#xff0c;字符指针变量 2&#xff0c;数组指针变量 3&#xff0c;函数指针变量 &#x1…

Spring MVC学习随笔-控制器(Controller)开发详解:控制器跳转与作用域(一)

学习视频&#xff1a;孙哥说SpringMVC&#xff1a;结合Thymeleaf&#xff0c;重塑你的MVC世界&#xff01;&#xff5c;前所未有的Web开发探索之旅 第五章、SpringMVC控制器开发详解 三 5.1 核心要点 3.流程跳转 5.2 JavaWeb中流程跳转的核心回顾 5.2.1 JavaWeb中流程跳转的核…

(数据结构)顺序表的查找

静态分配代码&#xff1a; #include<stdio.h> #include<stdlib.h> #define MAX 100 typedef struct LinkList {int data[MAX];int lenth; }Link; //初始化 void CreateList(Link* L) {L->lenth 0;for (int i 0; i < MAX; i){L->data[i] 0;} } //插入 …