• 数字图像处理——实验三 形态学图像处理实验


    一、实验目的

    (1)使用形态学滤波对图像进行腐蚀、膨胀运算;

    (2)使用形态学滤波对图像进行开闭运算;

    (3)利用 opencv-python 对图像进行形态学运算。

    二、实验主要仪器设备

    (1)计算机;

    (2)Python 3.x及PyCharm软件;

    (3)典型的灰度、彩色图像文件。

    • 注:opencv-python 使用的是3.x 版本

    三、实验原理

    数学形态学是以形态结构元素为基础对图像进行分析的数学工具。它的基本思想是用具有一定形态的结构元素去度量和提取图像中的对应形状以达到对图像分析和识别的目的。数学形态学的应用可以简化图像数据,保持它们基本的形状特征,并除去不相干的结构。数学形态学的基本运算有4个:膨胀、腐蚀、开启和闭合。它们在二值图像中和灰度图像中各有特点。基于这些基本运算还可以推导和组合成各种数学形态学实用算法。

    基本的形态运算是腐蚀和膨胀。

    在形态学中,结构元素是最重要最基本的概念。结构元素在形态变换中的作用相当于信号处理中的“滤波窗口”。用 B ( x ) B(x) B(x) 代表结构元素,对工作空间 E E E 中的每一点 x x x,腐蚀和膨胀的定义为:

    • 腐蚀: X = E ⊙ B ( x ) X=E \odot B(x) X=EB(x)

    • 膨胀: Y = E ⊗ B ( y ) Y=E \otimes B(y) Y=EB(y)

    B ( x ) B(x) B(x) E E E 进行膨胀的结果就是把结构元素 B B B 平移后使 B B B E E E 的交集非空的点构成的集合。先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。

    可见,二值形态膨胀与腐蚀可转化为集合的逻辑运算,算法简单,适于并行处理,且易于硬件实现,适于对二值图像进行图像分割、细化、抽取骨架、边缘提取、形状分析。但是,在不同的应用场合,结构元素的选择及其相应的处理算法是不一样的,对不同的目标图像需设计不同的结构元素和不同的处理算法。结构元素的大小、形状选择合适与否,将直接影响图像的形态运算结果。因此,很多学者结合自己的应用实际,提出了一系列的改进算法。如梁勇提出的用多方位形态学结构元素进行边缘检测算法既具有较好的边缘定位能力,又具有很好的噪声平滑能力。许超提出的以最短线段结构元素构造准圆结构元素或序列结构元素生成准圆结构元素相结合的设计方法,用于骨架的提取,可大大减少形态运算的计算量,并可同时满足尺度、平移及旋转相容性,适于对形状进行分析和描述。

    四、实验内容及代码

    4.1 实验内容

    (1)对原始图像进行灰度化、二值化处理;

    (2)对所得二值图像进行腐蚀运算;

    (3)对二值图像进行膨胀运算;

    (4)对二值图像进行开运算;

    (5)对二值图像进行闭运算。

    4.2 实验数据

    本实验有且仅用到一张图片,原始图片如 图1 所示:

    在这里插入图片描述

    图1. 原始图像

    4.3 实验代码

    import cv2
    import numpy as np
    
    img = cv2.imread('./data/2.jpg')
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, img_binary = cv2.threshold(img_gray, 55, 255, cv2.THRESH_BINARY)
    img_binary = np.ones(img_binary.shape, np.uint8)*255-img_binary
    cv2.imshow('img_binary', img_binary)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    kernel = np.ones((3, 3), np.uint8)
    # 腐蚀运算
    img_erosion = cv2.erode(img_binary, kernel)     # cv2.erode()方法用于对图像进行腐蚀
    cv2.imshow('img_eroded', img_erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # 膨胀运算
    img_dilation = cv2.dilate(img_binary, kernel, iterations=1)
    cv2.imshow('img_dilated', img_dilation)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # 开运算:先腐蚀后膨胀
    img_opening = cv2.morphologyEx(img_binary, cv2.MORPH_OPEN, kernel)
    cv2.imshow('img_opened', img_opening)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    # 闭运算:先膨胀后腐蚀
    img_closing = cv2.morphologyEx(img_binary, cv2.MORPH_CLOSE, kernel)
    cv2.imshow('img_closed', img_closing)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    二值图像效果展示:

    在这里插入图片描述

    图2. 二值化后的图像

    腐蚀运算处理后的图像效果展示:

    在这里插入图片描述

    图3. 腐蚀运算处理后的图像

    膨胀运算处理后的图像效果展示:

    在这里插入图片描述

    图4. 膨胀运算处理后的图像

    开运算处理后的图像效果展示:

    在这里插入图片描述

    图5. 开运算处理后的图像

    闭运算处理后的图像效果展示:

    在这里插入图片描述

    图6. 闭运算处理后的图像
  • 相关阅读:
    【用户画像】数据层mybatis、mabatis-plus介绍和使用,多数据源配置、生成分群基本信息(源码实现)
    【Django 开发】面试招聘信息网站(用户登录注册&投在线递简历)
    java毕业设计保险公司客户信息管理系统Mybatis+系统+数据库+调试部署
    Vue3中的computed和watch属性
    头歌-信息安全技术-Java生成验证码
    五三想休息,今天还学习,图解二叉树的层序遍历BFS(广度优先)模板,附面试题题解
    【T+】畅捷通T+增加会计科目提示执行超时已过期。
    【抽代复习笔记】21-群(十五):循环群引理及定义
    Opencv基本操作
    C# 第五章『面向对象』◆第4节:析构函数destructor
  • 原文地址:https://blog.csdn.net/alan1ly/article/details/125379425