EmguCV学习笔记 VB.Net 4.4 图像形态学

news2024/11/24 18:41:17

  版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

教程VB.net版本请访问:
EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码(博客上的教程内容会和pdf教程一致,教程中也会包含所有代码),请移步:EmguCV学习笔记

 

4.4 图像形态学

图像形态学是数字图像处理中的一种重要技术,它主要用于对二值图像进行分析和处理。图像形态学可以用于图像去噪、边缘检测、形态分析等方面。EmguCV提供了一系列的图像形态学操作函数,包括膨胀、腐蚀、开运算、闭运算等。

1. 膨胀 (Dilation)

膨胀是一种形态学操作,其基本思想是用一个结构元素 (Structuring Element) 在图像上滑动,将结构元素包含的像素值中的最大值作为当前像素值,从而实现对图像边缘的扩张和增强。EmguCV中的膨胀函数为CvInvoke.Dilate。

2. 腐蚀 (Erosion)

腐蚀是一种形态学操作,其基本思想是用一个结构元素在图像上滑动,将结构元素包含的像素值中的最小值作为当前像素值,从而实现对图像边缘的收缩和平滑。EmguCV中的腐蚀函数为CvInvoke.Erode。

3. 开运算 (Opening)

开运算是一种形态学操作,其基本思想是先进行一次腐蚀操作,再进行一次膨胀操作,从而可以去除比较小的物体、断开细长的物体等。EmguCV中的开运算函数为CvInvoke.MorphologyEx,其类型为MorphOp.Open。

4. 闭运算 (Closing)

闭运算是一种形态学操作,其基本思想是先进行一次膨胀操作,再进行一次腐蚀操作,从而可以填充物体内的小孔、连接断开的物体等。EmguCV中的闭运算函数为CvInvoke.MorphologyEx,其类型为MorphOp.Close。

图像形态学操作需要根据图像的特点和处理目的进行合理的选择和组合,才能达到良好的效果。

注意:图像形态学针对的是非黑色部分(非0部分)操作。

4.4.1 GetStructuringElement

通过CvInvoke.GetStructuringElement方法可以创建形态学操作的结构元素。该方法返回一个Mat对象。定义如下:

Public Shared Function GetStructuringElement(shape As Emgu.CV.CvEnum.ElementShape, ksize As System.Drawing.Size, anchor As System.Drawing.Point) As Emgu.CV.Mat

参数说明:

  1. shape:结构元素的形状,可以是Rectangle(矩形)、Cross(十字形)、Ellipse(椭圆形)。
  2. size:结构元素的大小。
  3. anchor:结构元素的锚点位置,用Point结构指定。可以使用 Nothing 或者(-1,-1),表示将锚点放置在结构元素的中心。

下面的代码创建了一个3x3的十字形结构元素:

Dim element As Mat

element= CvInvoke.GetStructuringElement(ElementShape.Cross, New Size(3, 3))

4.4.2 Erode

Erode方法对图像进行腐蚀操作,该方法声明如下:

Public Shared Sub Erode(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, element As Emgu.CV.IInputArray, anchor As System.Drawing.Point, iterations As Integer, borderType As Emgu.CV.CvEnum.BorderType, borderValue As Emgu.CV.Structure.MCvScalar)

参数说明:

  1. element:结构元素。
  2. anchor:结构元素的锚点位置,类型为Point。指定结构元素的锚点位置,一般为结构元素的中心,即(-1,-1)。
  3. iterations:腐蚀操作的迭代次数,类型为Integer。默认为1,表示进行一次腐蚀操作。
  4. Iterations:操作的迭代次数,类型为Integer。默认为1,表示进行一次膨胀操作。
  5. borderType:边界处理方式,类型为BorderType(详见4.2.1节【BorderType】)。需要注意的是,使用的BorderType类型不同生成结果不同。
  6. borderValue:边界值,类型为MCvScalar。当borderType为BorderType.Constant时,可以指定边界的像素值。通常设置为Nothing。

【代码位置:frmChapter4】Button12_Click、printMatByte

    'Erode腐蚀

    Private Sub Button12_Click(sender As Object, e As EventArgs) Handles Button12.Click

        '创建结构元素,这里是一个3*3大小的十字形结构

        Dim kernel As New Mat

        kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        Dim bte1(,) As Byte

        bte1 = {

            {0, 1, 1, 1, 1, 0, 0, 0, 0},

            {1, 1, 1, 1, 1, 1, 1, 1, 0},

            {1, 1, 1, 1, 1, 1, 1, 1, 0},

            {1, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 1},

            {0, 1, 1, 1, 1, 1, 1, 1, 1},

            {0, 1, 1, 1, 1, 1, 1, 1, 1},

            {0, 0, 0, 0, 1, 1, 1, 1, 0}

        }

        Dim matr1 As New Matrix(Of Byte)(bte1)

        Dim m1 As New Mat

        m1 = matr1.Mat

        Dim merode As New Mat        '

        '这里使用了2次迭代

        CvInvoke.Erode(m1, merode, kernel, New Point(-1, -1), 2, BorderType.Constant, Nothing)

        Call printMatByte(merode)

    End Sub

    '输出Mat的值

    Private Sub printMatByte(ByVal m As Mat)

        Dim matr As New Matrix(Of Byte)(m.Rows, m.Cols, m.NumberOfChannels)

        m.CopyTo(matr)

        For i As Integer = 0 To matr.Rows - 1

            For j As Integer = 0 To matr.Cols - 1

                Console.Write(matr(i, j))

                If j <> matr.Cols - 1 Then

                    Console.Write(",")

                End If

            Next

            Console.WriteLine()

        Next

End Sub

下图演示了使用腐蚀进行2次迭代的结果:

图4-12 进行二次腐蚀的情况

4.4.3 Dilate

Dilate方法对图像进行膨胀操作,该方法声明如下:

Public Shared Sub Dilate(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, element As Emgu.CV.IInputArray, anchor As System.Drawing.Point, iterations As Integer, borderType As Emgu.CV.CvEnum.BorderType, borderValue As Emgu.CV.Structure.MCvScalar)

参数请参看4.3.2节【Erode】中的介绍。

【代码位置:frmChapter4】Button13_Click

    'Dilate 膨胀

    Private Sub Button13_Click(sender As Object, e As EventArgs) Handles Button13.Click

        '创建结构元素,这里是一个3*3大小的十字形结构

        Dim kernel As New Mat

        kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        Dim bte2(,) As Byte

        bte2 = {

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 0, 1, 1, 1, 0, 0, 0, 0},

            {0, 0, 1, 1, 1, 0, 0, 0, 0},

            {0, 0, 0, 1, 1, 0, 0, 0, 0},

            {0, 0, 0, 0, 1, 1, 1, 0, 0},

            {0, 0, 0, 0, 1, 1, 1, 0, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0}

        }

        Dim matr2 As New Matrix(Of Byte)(bte2)

        Dim m2 As New Mat

        m2 = matr2.Mat

        Dim mdilate As New Mat

        '这里使用了2次迭代进行膨胀

        CvInvoke.Dilate(m2, mdilate, kernel, New Point(-1, -1), 2, BorderType.Constant, Nothing)

        Call printMatByte(mdilate)

End Sub

下图演示了使用腐蚀进行2次迭代的结果:

 

图4-13 进行二次膨胀的情况

以下代码演示了使用腐蚀和膨胀来处理图像。

【代码位置:frmChapter4】Button14_Click

    'ErodeDilate

    Private Sub Button14_Click(sender As Object, e As EventArgs) Handles Button14.Click

        Dim m As Mat = CvInvoke.Imread("C:\lessons\lena.jpg", CvEnum.ImreadModes.Color)

        ImageBox1.Image = m

        Dim mElement As New Mat

        mElement = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        '腐蚀

        Dim mout1 As New Mat

        CvInvoke.Erode(m, mout1, mElement, New Point(-1, -1), 2, BorderType.Default, Nothing)

        ImageBox2.Image = mout1

        '膨胀

        Dim mout2 As New Mat

        CvInvoke.Dilate(m, mout2, mElement, New Point(-1, -1), 2, BorderType.Default, Nothing

        ImageBox3.Image = mout2

End Sub

运行后如下图所示:

 

图4-14 使用腐蚀和膨胀处理图像

4.4.4 MorphologyEx

为了实现更多图像形态学操作,EmguCV提供了CvInvoke.MorphologyEx方法,声明如下:

Public Shared Sub MorphologyEx(src As Emgu.CV.IInputArray, dst As Emgu.CV.IOutputArray, operation As Emgu.CV.CvEnum.MorphOp, kernel As Emgu.CV.IInputArray, anchor As System.Drawing.Point, iterations As Integer, borderType As Emgu.CV.CvEnum.BorderType, borderValue As Emgu.CV.Structure.MCvScalar)

参数说明,其余参数请参看4.3.2节【Erode】中的介绍:

  1. operation:形态学操作类型,类型为MorphOp,包括以下几种形态学操作:
    1. Dilate:膨胀操作,
    2. Erode:腐蚀操作。
    3. Open:开运算,先进行腐蚀再进行膨胀,可以用于去除小的噪点和连接断开的区域。
    4. Close:闭运算,先进行膨胀再进行腐蚀,可以用于填充小的空洞和分离连接的区域。
    5. Gradient:梯度运算,用膨胀图像减去腐蚀图像,可以得到图像边缘。
    6. TopHat:高帽运算,用原始图像减去开运算后的图像,可以提取图像中的亮点或小的细节信息。
    7. BlackHat:低帽运算,用闭运算后的图像减去原始图像,可以提取图像中的暗点或背景信息。
    8. HitMiss:击中击不中运算,用于确定图像中是否存在指定的形状。它需要两个结构元素:一个前景结构元素和一个背景结构元素。在输入图像上,如果前景结构元素可以同时与前景像素和背景像素匹配,那么该像素属于击中集合;否则,它属于击不中集合。通过对击中集合进行膨胀操作并减去原始击中集合得到最终结果。

以下代码演示了使用开运算来处理图像数据,同时与腐蚀,膨胀操作图像数据做对比。

【代码位置:frmChapter4】Button15_Click

   'MorphologyEx:开运算:先腐蚀,再膨胀

    Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click

        Dim bte(,) As Byte

        bte = {

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 1, 0, 0, 0, 0, 0, 0, 0},

            {1, 1, 1, 0, 0, 0, 1, 1, 1},

            {1, 1, 1, 1, 1, 1, 1, 1, 1},

            {1, 1, 1, 1, 1, 1, 1, 1, 1},

            {1, 1, 1, 0, 0, 0, 1, 1, 1},

            {1, 1, 1, 1, 1, 1, 1, 1, 1},

            {0, 1, 0, 0, 0, 0, 1, 0, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0}

        }

        Dim matr As New Matrix(Of Byte)(bte)

        Dim m As New Mat

        m = matr.Mat

        '创建结构元素,这里是一个3*3大小的十字形结构

        Dim kernel As New Mat

        kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        '进行开运算

        Dim mMorphology As New Mat

        CvInvoke.MorphologyEx(m, mMorphology, MorphOp.Open, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        Call printMatByte(mMorphology)

        Console.WriteLine("===============================")

        '先腐蚀

        Dim merode As New Mat

        CvInvoke.Erode(m, merode, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        Call printMatByte(merode)

        Console.WriteLine("===============================")

        '再膨胀

        Dim mdilate As New Mat

        CvInvoke.Dilate(merode, mdilate, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        Call printMatByte(mdilate)

End Sub

下图演示了使用开运算处理图像数据的结果:

 

图4-15 开运算处理图像数据

以下代码演示了使用闭运算来处理图像数据,同时与膨胀,腐蚀操作图像数据做对比。

【代码位置:frmChapter4】Button16_Click

   'MorphologyEx:闭运算:先膨胀,再腐蚀

    Private Sub Button16_Click(sender As Object, e As EventArgs) Handles Button16.Click

        Dim bte(,) As Byte

        bte = {

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0},

            {0, 1, 1, 1, 0, 1, 1, 1, 0},

            {0, 1, 1, 1, 0, 1, 1, 1, 0},

            {0, 1, 1, 1, 1, 1, 1, 1, 0},

            {0, 1, 1, 1, 0, 1, 1, 1, 0},

            {0, 0, 0, 1, 1, 1, 0, 0, 0},

            {0, 0, 0, 1, 1, 0, 0, 0, 0},

            {0, 0, 0, 0, 0, 0, 0, 0, 0}

        }

        Dim matr As New Matrix(Of Byte)(bte)

        Dim m As New Mat

        m = matr.Mat

        '创建结构元素,这里是一个3*3大小的十字形结构

        Dim kernel As New Mat

        kernel = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        '闭运算

        Dim mMorphology As New Mat

        CvInvoke.MorphologyEx(m, mMorphology, MorphOp.Close, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        Call printMatByte(mMorphology)

        Console.WriteLine("===============================")

        '先膨胀

        Dim mdilate As New Mat

        CvInvoke.Dilate(m, mdilate, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        Call printMatByte(mdilate)

        Console.WriteLine("===============================")

        '再腐蚀

        Dim merode As New Mat

        CvInvoke.Erode(mdilate, merode, kernel, New Point(-1, -1), 1, BorderType.Constant, Nothing)

        Call printMatByte(merode)

End Sub

下图演示了使用闭运算处理图像数据的结果:

 

图4-16 闭运算处理图像数据

以下代码演示了使用闭运算和开运算来处理图像。

【代码位置:frmChapter4】Button17_Click

    'MorphologyEx:开运算和闭运算处理图像

    Private Sub Button17_Click(sender As Object, e As EventArgs) Handles Button17.Click

        Dim m As Mat = CvInvoke.Imread("C:\lessons\lena.jpg", CvEnum.ImreadModes.Color)

        ImageBox1.Image = m

        Dim mElement As New Mat

        mElement = CvInvoke.GetStructuringElement(ElementShape.Cross, New Drawing.Size(3, 3), New Point(-1, -1))

        '开运算

        Dim mout1 As New Mat

        CvInvoke.MorphologyEx(m, mout1, MorphOp.Open, mElement, New Point(-1, -1), 3, BorderType.Default, New MCvScalar(0, 0, 0))

        ImageBox2.Image = mout1

        '闭运算

        Dim mout2 As New Mat

        CvInvoke.MorphologyEx(m, mout2, MorphOp.Close, mElement, New Point(-1, -1), 3, BorderType.Default, New MCvScalar(0, 0, 0))

        ImageBox3.Image = mout2

End Sub

运行后如下图所示:

 

图4-17 开运算和闭运算处理图像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063820.html

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

相关文章

vue3模拟生成并渲染10万条数据,并实现本地数据el-table表格分页

效果图&#xff1a; 一点都不卡 话不多说&#xff0c;直接上码 <template><div class"container"><h3 class"table-title">el表格 分页</h3><el-table :data"tableList.slice((currentPage-1)*pageSize, currentPage*p…

OpenCV与AI深度学习 | 使用OpenCV图像修复技术去除眩光

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;使用OpenCV图像修复技术去除眩光 眩光是一种因过度和不受控制的亮度而引起的视觉感觉。眩光可能会使人丧失能力或只是让人感到不舒服。眩光是一…

源控终端|为么叫源控终端以及SDAF-8860源控终端具备发电单元次/超同步振荡监测监视,告警的功能在新能源场站中的应用

源控终端|为么叫源控终端以及SDAF-8860源控终端具备发电单元次/超同步振荡监测监视,告警的功能在新能源场站中的应用 SDAF-8860源控终端具备发电单元次/超同步振荡监测监视,告警的功能在新能源场站中的应用 SDAF-8608源控终端具有发电单元并网、脱网、低穿等信息快速采集与传输…

数据库;SQL语言; 数据库编程

数据库&#xff1a; 1.概念&#xff1a; 文件&#xff1a;存放数据&#xff0c;掉电数据不会丢失&#xff0c;软件的配置及想要持续保存的数据放入文件中 大批量数据存储和管理时使用数据库 2.类型&#xff1a; 1.关系型数据库 1.Or…

项目启动报错:liquibase.lockservice:? - Waiting for changelog lock....

异常报错&#xff1a; 原因 工作流表部分日志表被锁&#xff0c;可能上次未正常终止程序导致的异常。 处理 登录mysql指定项目对应数据库 SELECT * FROM DATABASECHANGELOGLOCK; UPDATE DATABASECHANGELOGLOCK SET locked0, lockgrantednull, lockedbynull WHERE id1;

通过Qt Creator Plugin开发Qt Creator插件-【金丹篇】

1.前言 由于工作学习需要基于Qt Creator架构开发类似的插件&#xff0c;本人感慨网络上Qt 相关的文档真是少。我直接在官方社区查找Qt Creator Plugin愣是一点资料没有。其实想想也是自定义的三方插件到Qt的IED,主要是个社区的贡献者或官方技术人员自用&#xff0c;他开发布会…

仿OpenAI网页前端制作的ChatGPT,超仿真!!!自定义!!!

仿OpenAI网页前端制作的ChatGPT&#xff0c;超仿真&#xff01;&#xff01;&#xff01;自定义&#xff01;&#xff01;&#xff01; 基于C#和WPF的仿真ChatGPT项目 啊没错我是标题党啊&#xff0c;下面内容AI生成的&#xff0c;主要是介绍我基于C#和WPF制作的仿真ChatGPT项…

【HTTP学习】HTTP协议

HTTP介绍 HTTP请求 这里的get没有请求体&#xff0c;会在网站中直接显示提交的表单。而post提交会将请求参数存放在表单中&#xff0c;需要通过F12进行查看。 HTTP响应 HTTP协议解析

一次不严谨的C++、C、Pascal、Rust等对比

起因 现在ACM用得多的基本上就两种语言&#xff0c;C和Python3&#xff0c;还有部分Java&#xff0c;但是当年ACM必学的Pascal、新近流行的rust也有人用&#xff0c;只不过用户很少。 就以一道codeforce上的算法小题为样本&#xff0c;来对比一样用户数量、执行效率、易写程度…

校园综合服务小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;发布信息管理&#xff0c;订单信息管理&#xff0c;类型管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;发布信息&#xff0…

【PyCharm】从零到一:Python爬虫实战教程,小白、绕过反爬虫机制、实战案例全解析

文章目录 前言一、使用的工具二、安装必要的库三、编写程序1.引入库2.发送GET请求3.绕过反爬虫机制4.解析HTML内容5.输出需要的内容 四、完整源码总结 前言 爬虫&#xff08;Web Crawler&#xff09;是一种自动浏览万维网并从中收集信息的程序。它们常被用于搜索引擎、数据分析…

基于UDP/TCP的 c/s 通信模型

基于UDP c/s通信模型 客户端&#xff08;socket&#xff1b;sendto ...&#xff09; 服务器端 ---把自己的地址公布出去 &#xff08;socket&#xff1b;bind //绑定&#xff1b; recvfrom ...&#xff09; 1.recvfrom函数&#xff1a; ssize_t recvfrom( int sockfd, /…

浮毛难清除、异味难消散?选到不好的宠物空气净化器会有什么危害

近年来&#xff0c;不少人家里都养了宠物&#xff0c;有些是猫、有些是狗&#xff0c;甚至有些是兔子&#xff0c;不少人希望能通过它们抒发心中的郁闷&#xff0c;成为自己的搭子。这些宠物在能带来欢乐的同时也会带来一些小烦恼&#xff0c;比如宠物的浮毛、异味都困扰着我们…

Linux日志管理基本介绍及日志轮替原理

&#x1f600;前言 本篇博文是关于日志管理&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x…

ai智能写作生成器哪个好用?推荐五款!

在内容创作日益重要的今天&#xff0c;ai智能写作生成器成为了众多创作者的得力助手。它们不仅能提高写作效率&#xff0c;还能提升写作内容的质量。然而&#xff0c;市场上的ai智能写作生成器众多&#xff0c;选择一个合适的生成器并非易事。本文将为你推荐5款好用的ai智能写作…

[图解]用例规约之业务规则不是算法

1 00:00:01,530 --> 00:00:03,090 像这种某某算法之类的 2 00:00:03,100 --> 00:00:04,130 它往往是什么 3 00:00:05,590 --> 00:00:07,440 某种实现的一个选择 4 00:00:08,140 --> 00:00:09,550 它很可能不是需求 5 00:00:10,620 --> 00:00:13,240 你要问他…

汉服推广网站

TOC springboot0790汉服推广网站 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;汉服文化平台网站依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性首页、汉服知识、服装展示、用户相册、…

实训day34(8.22)

一、回顾 高并发集群 饿了么后端的登录模块 1、数据库 1. 主从复制(高可用) 2. 传统的主从复制 3. gtids事务型的主从复制 4. 注意 1. server_id唯一 2. 8.x版本需要get_ssl_pub_key 3. 5.x不需要 4. change master to 5. stop | start slave 5. 非交互 import pymys…

Redis7基础篇(八)

redis集群 是什么 能干吗 集群算法-分片-槽位slot redis集群的槽位slot redis集群的分片 分片和槽位的优势 槽位映射的解决方案 上面的三个方案分别对应了小厂 中厂 大厂 哈希槽取余分区 缺点 一致性哈希算法分区 小总结 哈希槽分区 经典面试题 这里说的redis是ap而不是cp的 …

全球著名地标卫星影像收藏第3辑

世界那么大&#xff0c;一起去看看&#xff01; 我们在《全球著名地标卫星影像收藏第2辑》一文中&#xff0c;为大家分享了10全球著名地标高清卫星影像&#xff0c;现在继续为大家分享10个著名地标。 我们整理的这些地标KML文件可以分享大家&#xff0c;你也可以打开相应的UR…