引言

膨胀与腐蚀是图像形态学中的基本操作,本文将从两个角度实现python的膨胀与腐蚀算法,分别是特征提取与分割后处理。目前,在RGB图像领域,这两种形态学算法经常用于分割结果的处理,例如连通区处理。所以,笔者也结合这种思路实现了分割后的处理,但本数据集应用效果不佳,只是为大家提供一个参考(大佬们谅解~)。另外,提取基于反射率数据提取多波段图像的腐蚀与膨胀特征

基本原理

关于膨胀与腐蚀目前网上的释义比较多,但主要是围绕着两个概念去展开的。分别是结构元素与运算结构。在这本文简要介绍一下。

在特殊领域运算形式——结构元素,在每个像素位置上与二值图像对应的区域进行特定的逻辑运算。运算结构是输出图像的相应像素。运算效果取决于结构元素大小内容以及逻辑运算性质。

关于具体的运算过程,借用二值矩阵的网图描述。

1.膨胀算法

膨胀过程

2.腐蚀算法

腐蚀过程

数据介绍

上官:基于Python的遥感图像NDVI批处理​zhuanlan.zhihu.com

Python代码实现

from osgeo import gdal
import cv2 as cv
import numpy as np#定义图像打开方式
def image_open(image):data_array = gdal.Open(image)if data_array == "None":print("数据无法读取")return data_array#定义膨胀特征提取
def dilate(data, result_data):kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))for i in range(0, data.shape[0]):dilate_data = cv.dilate(data[i], kernel)result_data[i] = dilate_datareturn result_data#定义腐蚀特征提取
def erode(data, result_data):kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))for i in range(data.shape[0]):erode_data = cv.erode(data[i], kernel)result_data[i] = erode_datareturn result_data#定义OTSU算法的膨胀和腐蚀优化函数
def dilate_threshold(data):band = data.GetRasterBand(2).ReadAsArray(0, 0, width, height) #提取绿波段band_array = band.astype(np.uint8)threshold, binary = cv.threshold(band_array, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))result = cv.dilate(binary, kernel)return resultdef erode_threshold(data):band = data.GetRasterBand(2).ReadAsArray(0, 0, width, height) #提取绿波段band_array = band.astype(np.uint8)threshold, binary = cv.threshold(band_array, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))result = cv.erode(binary, kernel)return result#定义图像输出函数(面向多波段)
def datasave_MB(Filename, data):output1 = gdal.GetDriverByName("GTiff")output2 = output1.Create(Filename, width, height,data.shape[0], gdal.GDT_Float32)output2.SetProjection(Projection)output2.SetGeoTransform(Transform)for i in range(0, data.shape[0]):output2.GetRasterBand(i+1).WriteArray(data[i])del output2#定义图像输出函数(面向单波段)
def datasave_SB(Filename, data):output1 = gdal.GetDriverByName("GTiff")output2 = output1.Create(Filename, width, height,1, gdal.GDT_Float32)output2.SetProjection(Projection)output2.SetGeoTransform(Transform)output2.GetRasterBand(1).WriteArray(data)del output2#定义相关参数和矩阵
Filepath = r"E:yynctryedata20180911_yync(DA).tif"
data = image_open(Filepath)
width = data.RasterXSize
height = data.RasterYSize
Projection = data.GetProjection()
Transform = data.GetGeoTransform()
data1 = data.ReadAsArray(0, 0, width, height)
result = np.zeros(data1.shape)#定义膨胀和腐蚀的特征提取函数
Filename1 = r"E:yynctryedata膨胀处理.tif"
Filename2 = r"E:yynctryedata腐蚀处理.tif"
Filename3 = r"E:yynctryedataotsu膨胀处理.tif"
Filename4 = r"E:yynctryedataotsu腐蚀处理.tif"#膨胀特征结果输出
dilate_data = dilate(data1, result)
datasave_MB(Filename1, dilate_data)#OTSU算法的膨胀优化结果输出
datasave_SB(Filename3, dilate_threshold(data))#腐蚀特征结果输出
dilate_data = erode(data1, result)
datasave_MB(Filename2, dilate_data)#OTSU算法的腐蚀优化结果输出
datasave_SB(Filename4, erode_threshold(data))

关键函数说明

cv.getStructuringElement()

膨胀与腐蚀的核心函数的参数设置和应用基本相同,两个函数里面都有两个关键参数,分别是shape和ksize,Ksize我们不用多说,多以(5,5)(6,6)这样的形式呈现,表示计算的窗口大小。主要说一下shape参数,这个参数表示运算窗口的形状,目前在该两种形态操作中,shape参数支持三种形状,分别是cv.MORPH_REC,cv.MORPH_CROSS和cv.MORPH_ELLIPSE.

处理结果(部分)

根据结果我们发现膨胀与腐蚀的主要区别反映在道路、裸土等反射率较高的区域大小上。也就是说反射率较高的地物,膨胀操作会扩大其范围,相对地,在腐蚀操作上,范围会缩小

左图为膨胀特征右图为腐蚀特征(RGB模式)

参考文献

图像的膨胀与腐蚀--确认这个大牛的才是正确的_junpengxue的专栏-CSDN博客_膨胀和腐蚀​blog.csdn.net

膨胀与腐蚀_weixin_42255569的博客-CSDN博客_膨胀与腐蚀​blog.csdn.net

图像的腐蚀与膨胀_张齐贤的博客-CSDN博客_腐蚀与膨胀​blog.csdn.net

感言

很长时间没更新了,草稿箱很多残次品懒得整理。但今天想着一定要发出一篇来,于是把存货拿出来修改了一上午,哈哈。

python基于水色图像的水质评价_基于Python和遥感图像的膨胀与腐蚀操作相关推荐

  1. 学习笔记-基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day1

    基于全局和局部对比自监督学习的高分辨率遥感图像语义分割-day1 摘要 一. 引言 摘要 最近,监督深度学习在遥感图像(RSI)语义分割中取得了巨大成功. 然而,监督学习进行语义分割需要大量的标记样本 ...

  2. 基于全局和局部对比自监督学习的高分辨率遥感图像语义分割day3 - 网络结构

    基于全局和局部对比自监督学习的高分辨率遥感图像语义分割day3 - 网络结构 前言 自监督学习部分 语义分割细调部分 总结 前言 想要学习一个网络,最重要的就是网络结构和损失函数,一个讲了网络是怎么学 ...

  3. python基于水色图像的水质评价_零基础学习Python的学习路线及教程

    什么是Python? 在过去的2017年里,Python开发者在全球快速增长,国内小伙伴学习 Python 的热情一路高涨.同时,PYPL发布7月编程语言指数榜,Python 在今年5月首次超越 Ja ...

  4. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

  5. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  6. python虚拟环境的安装和配置_基于virtualenv的Python虚拟环境的安装配置(Mac环境)...

    一.安装前提 明确自己的开发所需的python版本, Python 2.7.x 或者Python 3.6.x . 安装 Python 2.7.x 或Python 3.6.x 版的virtualenv. ...

  7. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

  8. python制作浏览器 脚本之家_基于Python打造账号共享浏览器功能

    本篇文章介绍的内容会涉及到以下知识: PyQt5的使用; Selenium的使用; 代理服务器的架设和使用: 一.账号限制之痛 在如今的互联网中,免费的信息和资源占据了很大一部分,各类互联网应用提供了 ...

  9. python检测微信好友是否删除_基于Python+adb实现微信是否好友检测

    本文介绍的基于Python+adb实现的微信好友检测,是通过adb操控手机,模拟人的点击.截屏操作,对应用无侵入,无需扫描登录即可实现好友检测. 网上看到一些文章类似功能的实现,总结起来千篇一律的引入 ...

最新文章

  1. “几何深度学习”受爱因斯坦启示:让AI摆脱平面看到更高的维度
  2. 红米pro android 7,消费降级?红米Redmi Note 7Pro开箱以及简评
  3. 问题 B: 小鱼的搭配购物(并查集+01背包)
  4. Java读取文件时第一行出现乱码“?”问号
  5. koajs 项目实战(二)
  6. 一些在PHPStudy部署中出现的问题解决
  7. crossentropyloss 输入_Pytorch常用的交叉熵损失函数CrossEntropyLoss()详解
  8. android学习资料整理-----高级篇
  9. redis客户端下载(windos版本)
  10. 优秀的html布局,优秀的网页设计中常见的六大布局
  11. 隐蔽的API:基于RevitNET操作Revit文档。
  12. python 坐标轴单位标注_matlab坐标轴如何带单位标注?
  13. apollo 高精地图解析
  14. 抽象类和接口都不能被实例化
  15. Java--使用反编译工具,打开jar包,查看源码
  16. uniapp获取微信手机号码
  17. 百度贴吧挖坟实时监控 python版
  18. pomelo分布式聊天服务器详解
  19. linux 内存 cma,【原创】(十六)Linux内存管理之CMA
  20. Qbao Network 项目进展报告(2019.2.28-2019.3.13)

热门文章

  1. iOS--OCR图片识别
  2. CSDN开源夏令营 百度数据可视化实践 ECharts(8)
  3. 别再抱怨了,国内这么多优秀的Android资源你都知道吗?
  4. 八月十二日,周二总结
  5. 简单创建vsftp server
  6. HDFS小文件优化方法
  7. Bert 中文使用方式
  8. excel 怎么让数字不用科学计数法
  9. 机器学习模型身后的数学和统计背景:统计与信息论Probability and Information Theory
  10. Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)