Python图像形态学处理:腐蚀、膨胀、礼帽、黑帽……

news2024/11/17 17:26:07

文章目录

    • 二值形态学
    • 灰度形态学

python图像处理教程:初步📷插值变换

最基础的形态学操作有四个,分别是腐蚀、膨胀、开计算和闭计算,【scipy.ndimage】分别实现了二值数组和灰度数组的这四种运算。而针对灰度图像,【scipy.ndimage】还提供了礼帽、黑帽、形态学梯度和拉普拉斯梯度等操作。

二值形态学

二值图像中只有0和1两种元素,故而可将其表示为元素值为 1 1 1的元素位置集合 A = { ( i , j ) ∣ A i j = 1 } A=\{(i,j)\vert A_{ij}=1\} A={(i,j)Aij=1},则腐蚀和膨胀可表示为

A ⊖ B = { ( i , j ) ∣ B i j ⊆ A } A ⊕ B = { ( i , j ) ∣ B i j ∪ A ≠ ∅ } \begin{aligned} A\ominus B&=\{(i,j)|B_{ij}\subseteq A\}\\ A\oplus B&=\{(i,j)|B_{ij}\cup A\not=\varnothing\} \end{aligned} ABAB={(i,j)BijA}={(i,j)BijA=}

其中 B i j B_{ij} Bij表示当 B B B的原点在 ( i , j ) (i,j) (i,j)处时,B中所有为1的值的集合。

用结构B腐蚀A,当B的原点平移到图像A的像元 ( i , j ) (i,j) (i,j)时,若B完全被二者的重叠区域所包围,则赋值为1,否则赋值为0。更直观的例子是,如果B中为1的元素位置上,对应的A的像素值也都为1,则 ( i , j ) (i,j) (i,j)处为1。膨胀则与之相反。

开运算和闭运算则是腐蚀、膨胀的叠加,开运算是先腐蚀后膨胀;闭运算是先膨胀后腐蚀。这四种运算的差别如下

在这里插入图片描述

二值图像的腐蚀、膨胀、开、闭运算分别由函数binary_erosion, binary_dilation, binary_opening, binary_closing来是实现,上述绘图代码如下。

import numpy as np
import matplotlib.pyplot as plt
import scipy.ndimage as sn

x = np.zeros([20,20])
x[5:15, 5:15] = 1
x[10:12,10:12] = 0
x[2:4, 2:4] = 1

func = {
    "origin": lambda x : x,
    "erosion": sn.binary_erosion,
    "dilation": sn.binary_dilation,
    "opening": sn.binary_opening,
    "closing": sn.binary_closing
}

fig = plt.figure()
for i,key in enumerate(func):
    ax = fig.add_subplot(2,3,i+1)
    ax.imshow(func[key](x))
    plt.title(key)

plt.show()

灰度形态学

【ndimage】中为灰度图像也提供了腐蚀、膨胀、开、闭运算,只需将二值函数中的binary替换为grey即可。此外,针对灰度图像,【ndimage】还额外提供了四种运算,如下表所示

函数名称备注
morphological_gradient形态学梯度膨胀图减去腐蚀图
white_tophat礼帽(顶帽)运算原图减去开运算
black_tophat黑帽(底帽)运算原图减去闭运算
morphological_laplace拉普拉斯变换

这些方法的差异如下

在这里插入图片描述
绘图代码如下。

from scipy.misc import ascent
img = ascent()

funcs = {
    "original": lambda x, tmp:x,
    "erosion" : sn.grey_erosion,
    "dilation" : sn.grey_dilation,
    "opening" : sn.grey_opening,
    "closing" : sn.grey_closing
}

fig = plt.figure()
for i, key in enumerate(funcs):
    ax = fig.add_subplot(2,5,i+1)
    plt.imshow(funcs[key](img, (10,10)), cmap=plt.cm.gray)
    plt.axis('off')
    plt.title(key)


ori = img[350:500, 400:500]
funcs = {
    "ori": lambda x, tmp:x,
    "white" : sn.white_tophat,
    "black" : sn.black_tophat,
    "gradient" : sn.morphological_gradient,
    "laplace" : sn.morphological_laplace,
}

for i, key in enumerate(funcs):
    ax = fig.add_subplot(2,5,i+6)
    plt.imshow(funcs[key](ori, (5,5)), cmap=plt.cm.gray)
    plt.title(key)
    plt.axis('off')

plt.show()

参数列表

二值函数和灰度函数的参数并不相同,下面以closing运算为例,二值和灰度函数的所有参数,除了输入input之外,二者共有的参数有

  • structure 为数组类型,表示构造元素,可以理解为是卷积模板
  • output 与输入相同维度的数组,可以存下结果
  • orgin 过滤器设置,默认为0

二值形态学滤波的其他参数如下

binary_closing(input, iterations=1, mask=None, border_value=0, brute_force=False)

其中

  • iterations 执行次数
  • mask 掩模数组,为bool类型的数组,对应False的位置将不会改变
  • border_value 边缘处的值
  • brute_force 如果为False,则只有上次迭代中发生变化的值才会更新
grey_closing(input, size=None, footprint=None, mode='reflect', cval=0.0)
  • size 为滤波模板
  • mode 可选reflect,constant,nearest,mirror, wrap,边缘填充方式
  • cval 边缘填充值

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

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

相关文章

android路由表APP,携程Android面试题

大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯&…

(案例贴2) html+css 倒计时器

欢迎大家使用这个计时器噢 老哥直接附代码咯. timer.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">&l…

python 小游戏《2048》字符版非图形界面

参考链接&#xff1a; 闲谈2048小游戏和数组的旋转及翻转和转置 目录 2048 一、方阵类 二、随机插入1或2 三、 合并和递增 四、 判断和移动 五、 键盘控制 完整源代码 玩法过程 2048 上回说到2048小游戏中数组的各种旋转、翻转的方法&#xff0c;就是为代码编程作准…

非阻塞实现高效键盘扫描功能(STM32F4XX)

目录 概述 1 原理分析 1.1 技术背景 1.2 系统硬件 1.3 STM32 IO&#xff08;输入模式&#xff09;寄存器分析 1.3.1 输入IO的功能描述 1.3.2 输入配置 1.3.3 GPIO 寄存器&#xff08;输入模式相关&#xff09; 1.3.3.1 GPIO 端口模式寄存器 1.3.3.2 GPIO 端口上拉/下拉…

VUE3自定义文章排行榜的简单界面

文章目录 一、代码展示二、代码解读三、结果展示 一、代码展示 <template><div class"article-ranking"><div class"header"><h2 class"title">{{ title }}</h2></div><div class"ranking-list&qu…

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

默频,主频,睿频

一、默频 默频就是跟在CPU型号后面的数字&#xff0c;如图中的CPU,默频是1.7GHZ 二、主频 可以理解为在运行中&#xff0c;电脑根据程序的需要进行调度&#xff0c;此时CPU的实际频率&#xff0c;在任务管理器中可以查看&#xff0c;如我的笔记本电脑在没有连接电源的情况下&…

云计算 2月21号 (linux文件及用户管理)

一、文件管理 1.1快捷键 编辑命令&#xff1a; Ctrl a &#xff1a;移到命令行首 Ctrl e &#xff1a;移到命令行尾 Ctrl u &#xff1a;从光标处删除至命令行首 Ctrl k &#xff1a;从光标处删除至命令行尾 Ctrl w &#xff1a;从光标处删除至字首 Ctrl d &#x…

图解知识蒸馏

soft labels与soft predictions越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做distillation loss&#xff0c;也叫soft loss。 hard label y与hard prediction越接近越好&#xff0c;通过Loss Fn来实现&#xff0c;产生的数值叫做student loss&#xff0c…

模拟算法题练习(二、DNA序列修正、无尽的石头)

&#xff08;一、DNA序列修正&#xff09; 问题描述 在生物学中&#xff0c;DNA序列的相似性常被用来研究物种间的亲缘关系。现在我们有两条 DNA序列&#xff0c;每条序列由 A、C、G、T 四种字符组成&#xff0c;长度相同。但是现在我们记录的 DNA序列存在错误&#xff0c;为了…

C语言题目:指针

1. 下面代码的结果是&#xff1a; #include <stdio.h> int i; int main() {i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; }答案&#xff1a;> 解析&#xff1a; i作为全局变量且在未赋值的情况下初始值为1&…

大数据分布式计算工具Spark数据计算实战讲解(filter方法,distinct方法,sortby方法)

练习案例 # #单词统计计数 from pyspark import SparkConf, SparkContext import os os.environ[pyspark_python] "D:/python/JIESHIQI/python.exe" #创建一个sparkconf类对象 conf SparkConf().setMaster("local[*]").setAppName("test_spark_app…

学不动系列-git-hooks和husky+lintstage

git-hooks 为了保证提交的代码符合规范&#xff0c;可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现&#xff0c;在使用husky之前&#xff0c;我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…

日志系统项目实现

日志系统的功能也就是将一条消息格式化后写入到指定位置&#xff0c;这个指定位置一般是文件&#xff0c;显示器&#xff0c;支持拓展到数据库和服务器&#xff0c;后面我们就知道如何实现拓展的了&#xff0c;支持不同的写入方式(同步异步)&#xff0c;同步:业务线程自己写到文…

C语言基础(二)

5.指针 5.1 指针的定义 内存区域中的每字节都对应一个编号&#xff0c;这个编号就是“地址”. 在程序中定义一个变量&#xff0c;在对程序进行编译时&#xff0c;系统就会给这个变量分配内存单元. 按变量地址存取变量值的方式称为“直接访问”&#xff0c;如printf("&qu…

Nodejs+vue汽车保养美容管理系统vscode前后端分离项目

汽车美容保养管理系统后台采用nodejs语言开发,前台页面和后台管理页面使用vue等技术开发,使用MySql作为数据持久化存储工具对汽车美容保养管理系统的用户等角色权限对应的功能等进行存储。采用vsocde集成IDE对汽车美容保养管理系统统进行开发,整合系统的各个模块。 拟开发的汽车…

【数据分享】2000~2023年MOD15A2H 061 叶面积指数LAI数据集

各位同学们好&#xff0c;今天和大伙儿交流的是2000~2013年MOD15A2H 061 LAI数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 Myneni, R., Y. Knyazikhin, T. Park. MODIS/Terra Leaf Area Index/FPAR 8-Day L4 Global 500m SIN Grid V061. 2021, d…

Python:关于数据服务中的Web API的设计

搭建类似joinquant、tushare类似的私有数据服务应用&#xff0c;有以下一些点需要注意&#xff1a; 需要说明的是&#xff0c;这里讨论的是web api前后端&#xff0c;当然还有其它方案&#xff0c;thrift&#xff0c;grpc等。因为要考虑到一鱼两吃&#xff0c;本文只探讨web ap…

USB - 设备架构及设备描述符

一、USB的设备架构 USB从上到下分为设备&#xff08;device&#xff09;、配置&#xff08;config&#xff09;、接口&#xff08;interface&#xff09;和端点&#xff08;endpoint&#xff09;四个层次。 Linux的USB设备驱动是绑定到接口上的, 每个接口在主机看来都是一个独…

基于springboot+vue的共享汽车管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…