玩转Python图像处理之二值图像腐蚀详解

目录
  • 1 引言
  • 2 腐蚀概念
  • 3 举个栗子
  • 4 水平腐蚀
    • 4.1 理论基础
    • 4.2 代码实现
  • 5 垂直腐蚀
    • 5.1 理论基础
    • 5.2 代码实现
  • 6 全方向腐蚀
    • 6.1 理论基础
    • 6.2 代码实现
  • 7 总结

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], 其具体实现步骤如下:

  1. 根据原始图像的宽和高,初始化结果图为全白图(背景为白色)
  2. 由于我们采用的是横向腐蚀操作,结构元素为1X3,因此我们不处理最左边和最右边的两列像素,从第2行第2列开始,逐个遍历每行元素,判断该元素的前一个像素和后一个像素是否含有背景点,有则说明在结果图上该点需要被腐蚀掉,将该点像素点的灰度值赋值为255,否则保持不变
  3. 循环上述步骤,直至处理完原图所有像素点。

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 总结

通过上述简单步骤,我们实现了二值图像水平腐蚀垂直腐蚀以及全向腐蚀,并给出了完整代码实例。

您学废了吗?

到此这篇关于Python图像处理笔记之二值图像腐蚀的文章就介绍到这了,更多相关Python二值图像腐蚀内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python图像处理二值化方法实例汇总

    在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增). 1. opencv 简单阈值 cv2.threshold 2. opencv 自适应阈值 cv2.adaptiveThreshold (自适应阈值中计算阈值的方法有两种:mean_c 和 guassian_c ,可以尝试用下哪种效果好) 3. Otsu's 二值化 例子: import cv2 import numpy as np f

  • opencv python如何实现图像二值化

    这篇文章主要介绍了opencv python如何实现图像二值化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import cv2 as cv import numpy as np import matplotlib.pyplot as plt # 二值图像就是将灰度图转化成黑白图,没有灰,在一个值之前为黑,之后为白 # 有全局和局部两种 # 在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答

  • python-opencv获取二值图像轮廓及中心点坐标的代码

    python-opencv获取二值图像轮廓及中心点坐标代码: groundtruth = cv2.imread(groundtruth_path)[:, :, 0] h1, w1 = groundtruth.shape contours, cnt = cv2.findContours(groundtruth.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if len(contours) != 1:#轮廓总数 continue M = cv

  • Python库skimage绘制二值图像代码实例

    二值图像的凸壳指的是包围输入二值图像白色区域的最小的凸多边形的像素集合. skimage中的函数 from skimage.morphology import convex_hull_image chull = convex_hull_image(image) 完整代码: """ =========== Convex Hull =========== The convex hull of a binary image is the set of pixels included

  • Python+OpenCV图像处理——图像二值化的实现

    简介:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程. 普通图像二值化 代码如下: import cv2 as cv import numpy as np #全局阈值 def threshold_demo(image): gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY) #把输入图像灰度化 #直接阈值化是对输入的单通道矩阵逐像素进行阈值分割. ret, binary = cv.threshold(gray

  • 玩转Python图像处理之二值图像腐蚀详解

    目录 1 引言 2 腐蚀概念 3 举个栗子 4 水平腐蚀 4.1 理论基础 4.2 代码实现 5 垂直腐蚀 5.1 理论基础 5.2 代码实现 6 全方向腐蚀 6.1 理论基础 6.2 代码实现 7 总结 1 引言 形态学运算是针对二值图像依据数学形态学集合论方法发展起来的图像处理的方法.其主要内容是设计一整套的变换概念和算法,用以描述图像的基本特征. 在图像处理中,形态学的应用主要有以下两点:利用形态学的基本运算,对图像进行观察和处理,从而达到改善图像质量的目的;描述和定义图像的各种几何参数和

  • Python图像处理之图像金字塔详解

    目录 一.图像金字塔原理 二.图像向上取样 三.图像向下取样 四.总结 一.图像金字塔原理 上一篇文章讲解的图像采样处理可以降低图像的大小,本文将补充图像金字塔知识,了解专门用于图像向上采样和向下采样的pyrUp()和pyrDown()函数. 图像金字塔是指由一组图像且不同分别率的子图集合,它是图像多尺度表达的一种,以多分辨率来解释图像的结构,主要用于图像的分割或压缩.一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.如图10-1所示,它包括了四层图像,将

  • Python图像处理之边缘检测原理详解

    目录 原理 Sobel检测算子 Laplacian算子 算子比较 原理 边缘检测是图像处理和计算机视觉当中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,图像的边缘检测可以大幅度的减少数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性,它们绝大多数可以分为两类:基于搜索和基于零穿越. 基于搜索:通过寻找图像一阶导数中max来检测边界,然后利用计算结果估计边缘的局部方向,通常采用梯度的方向,并在此方向找到局部梯度模的最大值,代表的算法是Sobel算子和Scharr算子.

  • 玩数据必备Python库之numpy使用详解

    目录 前言 1. ndarray介绍 2. ndarray的基本操作 生成数组 数组索引.切片 修改数组形状 修改数组类型 数组去重 删除元素 3. ndarray运算 逻辑运算 统计运算 数组运算 4. matrix 矩阵介绍 5. Python中矩阵运算 扩展:正态分布简介 正态分布图 方差 总结 前言 numpy 库是 一个科学计算库, 使用方法:import numpy as np 用于快速处理任意维度的数组,存储的对象是ndarray 用于矩阵运算,存储的对象是matrix 1. nd

  • python数字图像处理图像的绘制详解

    目录 正文 一.用figure函数和subplot函数分别创建主窗口与子图 二.用subplots来创建显示窗口与划分子图 三.其它方法绘图并显示 正文 实际上前面我们就已经用到了图像的绘制,如: io.imshow(img) 这一行代码的实质是利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据.因此,我们也可以这样写: import matplotlib.pyplot as plt plt.imshow(img) imshow()函数格式为: matp

  • Python常用图像形态学操作详解

    目录 腐蚀 膨胀 开运算与闭运算 开运算 闭运算 梯度运算 礼帽与黑帽 礼帽 黑帽 腐蚀 在一些图像中,会有一些异常的部分,比如这样的毛刺: 对于这样的情况,我们就可以应用复式操作了.需要注意的是,腐蚀操作只能处理二值图像,即像素矩阵的值只有0(黑色)和255(白色).我们先看看代码和效果: import cv2 import numpy as np img = cv2.imread('dagongren.png') # 腐蚀的代码 kernel = np.ones((3,3),np.uint8

  • python OpenCV 实现高斯滤波详解

    目录 一.高斯滤波 二.C++代码 三.python代码 四.结果展示 1.原始图像 2.5x5卷积 3.9x9卷积 一.高斯滤波    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程. [1] 通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. 二.C++代码

  • Python代码调试技巧教程详解

    目录 关于代码调试的技巧,我之前写过很多的文章,加起来也有 将近 10 篇了,关注比较早的同学,也应该都有看过. 还没看过的同学,欢迎前往查阅:调试技巧 其中有一篇是关于 pdb 的调试技巧的: 里面介绍了两种 pdb 的调试入口,也是大部分所熟知的. 这里再带大家回顾一下 第一种:指定 -m pdb 来开启 $ python -m pdb pdb_demo.py 第二种:使用 pdb.set_trace() 在代码中设置断点 import pdb pdb.set_trace() 但其实,pdb

  • 最强Python可视化绘图库Plotly详解用法

    今天给大家分享一篇可视化干货,介绍的是功能强大的开源 Python 绘图库 Plotly,教你如何用超简单的(甚至只要一行)代码,绘制出更棒的图表. 我之前一直使用 matplotlib ,由于它复杂的语法,我已经"沉没"在里面太多的时间成本.这也导致我花费了不知多少个深夜,在 StackOverflow 上搜索如何"格式化日期"或"增加第二个Y轴". 但我们现在有一个更好的选择了 ,比如易于使用.文档健全.功能强大的开源 Python 绘图库

随机推荐