玩转Python图像处理之二值图像腐蚀详解
作者:赵卓不凡 发布时间:2022-09-01 16:23:24
1 引言
形态学运算是针对二值图像依据数学形态学集合论方法发展起来的图像处理的方法.其主要内容是设计一整套的变换概念和算法,用以描述图像的基本特征.
在图像处理中,形态学的应用主要有以下两点:利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;描述和定义图像的各种几何参数和特征等.
2 腐蚀概念
数学形态学的运算以腐蚀和膨胀这两种基本运算为基础,腐蚀操作在数学形态学上的作用是消除物体的边界点,使边界向内部收缩的过程,主要用于将小于物体结构元素的物体去除.例如两个物体之间有细小的连通,可以通过腐蚀操作将两个物体分开.腐蚀的数学表达式为:
上述公式中:
S表示腐蚀后的二值图像
B表示用来进行腐蚀操作的结构元素,结构元素内每一个元素取值为0或1,它可以组成任何一种形状的图形;
X表示原图经过二值化后的像素集合.
此公式的含义是用B来腐蚀X得到的集合S,S是由B完全包括在X中时B的当前位置的集合.
3 举个栗子
只看上面公式,是不是有种云里雾里的感觉,那我们不妨来举个栗子说明一下,请看下图:
左侧a为被处理的二值图像,白色部分表示背景,灰色部分表示目标X;
中间为结构元素B,黑色点为结构元素的中心点,灰色的方格表示邻域;
右侧c中黑色的部分表示腐蚀后的结果,灰色的部分表示目标图像被腐蚀掉的部分.
我们可以这样理解上述腐蚀过程,即用B的中心点和X上的点一个一个地对比,如果B上所有对应的点都在X的范围内,则该点保留;否则将该点去除;
通俗的讲就是将结构元素在图像中移动,如果结构元素完全包含在目标图像X中,则保留目标图像中对应于中心点的像素点,否则删除该像素点.
4 水平腐蚀
4.1 理论基础
图像腐蚀操作按照所采用的结构元素的类型,可以分为以下三类:水平腐蚀垂直腐蚀以及全方向腐蚀.其中水平腐蚀所采用的结构元素为[0,0,0], 其具体实现步骤如下:
根据原始图像的宽和高,初始化结果图为全白图(背景为白色)
由于我们采用的是横向腐蚀操作,结构元素为1X3,因此我们不处理最左边和最右边的两列像素,从第2行第2列开始,逐个遍历每行元素,判断该元素的前一个像素和后一个像素是否含有背景点,有则说明在结果图上该点需要被腐蚀掉,将该点像素点的灰度值赋值为255,否则保持不变
循环上述步骤,直至处理完原图所有像素点。
4.2 代码实现
使用python实现按上述过程,核心代码如下:
def horizon_erode(bin_img):
out_img = np.zeros(shape=bin_img.shape, dtype=np.uint8) + 255
h = bin_img.shape[0]
w = bin_img.shape[1]
for i in range(h):
for j in range(1,w-1):
out_img[i][j]=0
for k in range(3):
if bin_img[i][j+k-1] > 127:
out_img[i][j]=255
return out_img
运行结果如下:
上图中,从左往右依次为彩色原图,二值化后的结果图,以及采用水平腐蚀后的效果图,可以看到腐蚀后的图相比二值图外围在纵向上被腐蚀掉一圈。
5 垂直腐蚀
5.1 理论基础
垂直腐蚀和水平腐蚀原理类似,只是所采用的结构元素不同,垂直腐蚀所使用的结构元素为 [ 0 , 0 , 0 ] T [0,0,0]^T [0,0,0]T,其详细的实现步骤如下:
根据原始图像的宽和高,初始化结果图为全白图(背景为白色)
由于我们采用的是垂直腐蚀操作,结构元素为3X1,因此我们不处理最上边和最下边的两行像素,从第2行第2列开始,逐个遍历每行元素,判断该元素的上一个像素和下一个像素是否含有背景点,有则说明在结果图上该点需要被腐蚀掉,将该点像素点的灰度值赋值为255,否则保持不变
循环上述步骤,直至处理完原图所有像素点。
5.2 代码实现
使用python实现按上述过程,核心代码如下:
def vertical_erode(bin_img):
out_img = np.zeros(shape=bin_img.shape, dtype=np.uint8) + 255
h = bin_img.shape[0]
w = bin_img.shape[1]
for i in range(1,h-1):
for j in range(w):
out_img[i][j]=0
for k in range(3):
if bin_img[i+k-1][j] > 127:
out_img[i][j]=255
return out_img
运行结果如下:
上图中,从左往右依次为彩色原图,二值化后的结果图,以及采用垂直腐蚀后的效果图,可以看到腐蚀后的图相比二值图在横向上被腐蚀掉一圈。
6 全方向腐蚀
6.1 理论基础
全方向腐蚀综合了垂直腐蚀和水平腐蚀,所采用的结构元素为十字形,全向腐蚀的一般实现步骤如下:
根据原始图像的宽和高,初始化结果图为全白图(背景为白色)
全向腐蚀包含垂直腐蚀和水平腐蚀,这里我们采用3X3的结构元素,如下所示:
为防止越界,我们不处理最上边、最右边、最下边和最左边共四边的元素,从第2行第2列开始,逐个遍历每个元素,判断该元素的上一个像素 下一个像素 前一个像素 以及后一个像素这四个位置(即数组中除中心点外,四个为0的位置)中是否含有背景点,有则说明在结果图上该点需要被腐蚀掉,将该点像素点的灰度值赋值为255,否则保持不变。当然也可以定义不同形状的结构元素B来进行不同的腐蚀效果,但处理方法都是检查B中所对应的像素点是否全部为物体,是则保留该点,否则置为255.
循环上述步骤,直至处理完原图所有像素点。
6.2 代码实现
使用python实现按上述过程,核心代码如下:
def all_erode(bin_img):
out_img = np.zeros(shape=bin_img.shape, dtype=np.uint8) + 255
h = bin_img.shape[0]
w = bin_img.shape[1]
B=[1,0,1,0,0,0,1,0,1]
for i in range(1,h-1):
for j in range(1,w-1):
out_img[i][j]=0
for m in range(3):
for n in range(3):
if B[m*3+n] == 1:
continue
if bin_img[i+m-1][j+n-1] > 127:
out_img[i][j]=255
return out_img
运行结果如下:
上图中,从左往右依次为彩色原图,二值化后的结果图,以及采用垂直腐蚀后的效果图,可以看到腐蚀后的图相比二值图在横向和纵向上都被腐蚀掉一圈。
7 总结
通过上述简单步骤,我们实现了二值图像水平腐蚀垂直腐蚀以及全向腐蚀,并给出了完整代码实例。
您学废了吗?
来源:https://blog.csdn.net/sgzqc/article/details/120367506


猜你喜欢
- mysql的存储过程、游标 、事务实例详解下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。其中,涉及到了存
- 本文实例为大家分享了vue实现轮播图帧率播放的具体代码,供大家参考,具体内容如下需求传入一个数组,数组中放的是目录名称,通过本目录名称,读取
- MySQL多表查询添加练习表-- 用户表(user)CREATE TABLE `user`(`id` INT AUTO_INCREMENT
- 基本属性定义当前地牢的等级,地图长宽,房间数量,房间的最小最大长度,如下class Map: def __init
- 图片优化1、图片大小优化,部分图片使用WebP(需要考虑webp兼容性)在线生成,如智图、又拍云gulp生成,gulp-webp或gulp-
- 本文实例讲述了Python实现的爬取百度文库功能。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-from s
- 切片原型 strs = ‘abcdefg'Strs[start: end:step]切片的三个参数分别表开始,结束,步长第一位下标为
- 写这篇博客主要是因为在修改DataFrame列值的时候经常遇到bug,但到目前还没把这种错误复现出来。DataFrame是Pandas中的主
- Apache 从2.2升级到 Apache2.4.x 后配置文件 httpd.conf 的设置方法有了大变化,以前是将 deny from
- Python中numpy数组的合并有很多方法,如- np.append() - np.concatenate() - np.stack()
- MySQL的主键可以是自增的,那么如果在断电重启后新增的值还会延续断电前的自增值吗?自增值默认为1,那么可不可以改变呢?下面就说一下 MyS
- 一、Requests库的7个主要的方法1.request()构造请求,支撑以下的基础方法2.get()获取HTML页面的主要方法,对应于ht
- 运行结果(2020-2-4日数据)数据来源news.qq.com/zt2020/page/feiyan.htm抓包分析日报数据格式"
- 前言 使用scrapy进行大型爬取任务的时候(爬取耗时以天为单位),无论主机网速多好,爬完之后总会发现scrapy
- 有时候在使用 Python 的时候,想要对一个数字或者字符串进行补零操作,即把「1」变为一个八位数的「00000001」,这个时候可以使用一
- Python综合应用——宿舍管理系统,供大家参考,具体内容如下/p>通过对 python 的函数,变量的应用,编写简单的关系系统实现功
- 使用现有的txt文本和图片,就可以用wordcloud包生成词云图。大致步骤是:1、读取txt文本并简单处理;2、读取图片,以用作背景;3、
- virtualenv与virtualenvwrapper当涉及到python项目开发时为了不污染全局环境,通常都会使用环境隔离管理工具vir
- (一) 常用的CSS命名规则:头:header内容:content/container尾:footer导航:nav侧栏:sidebar栏目:
- 如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线。所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器