当前位置: 首页 > article >正文

《OpenCV计算机视觉》—— 图像形态学(腐蚀、膨胀等)

文章目录

  • 一、图像形态学基本概念
  • 二、基本运算
    • 1.简单介绍
    • 2.代码实现
  • 三、高级运算
    • 1.简单介绍
    • 2.代码实现

一、图像形态学基本概念

  • 图像形态学是图像处理科学的一个独立分支,它基于集合论和数学形态学的理论,专门用于分析和处理图像中的形状和结构
  • 图像形态学处理主要关注的是二值图像(黑白图像或是灰度图),其基本思想是用具有一定形态特征的结构元素去量度和提取图像中的对应形状,以实现图像分析和识别的目的。与传统的基于线性理论的空域或频域图像处理技术相比,图像形态学具有不模糊图像边界和细节、对噪声不敏感、提取的图像边缘平滑、骨架较连续、易于并行处理等特点

二、基本运算

1.简单介绍

  • 图像形态学的基本运算主要包括四种:膨胀、腐蚀、开运算和闭运算。

    • 腐蚀(Erosion):通过结构元素与图像进行卷积,将结构元素包含的图像区域缩小,以去除图像中小的细节和噪声。这一操作可以用于细化边缘、分离紧密相连的物体等。
    • 膨胀(Dilation):与腐蚀相反,膨胀操作通过结构元素与图像进行卷积,将结构元素包含的图像区域扩大,以填充图像中的空洞和连接图像中的断线。这有助于填充小的空洞、连接断裂的物体等。
    • 开运算(Opening):先进行腐蚀操作,再进行膨胀操作的组合。这种操作可以去除图像中的小噪声和细小物体,同时保留图像中的主要结构。
    • 闭运算(Closing):与开运算相反,闭运算是先进行膨胀操作,再进行腐蚀操作的组合。它可以用于填充图像中的小空洞,连接图像中的断裂结构,并平滑图像边缘。

2.代码实现

  • 基本运算代码实现

    import cv2
    import numpy as np
    
    # 读取图像(这里所给的图片已经是黑白图,直接读取,不需要进行二值化操作)
    image = cv2.imread('zhiwen.png')
    
    # 定义结构元素
    # 这里使用3x3的正方形结构元素
    kernel = np.ones((3, 3), np.uint8)
    
    # 腐蚀操作 cv2.erode()
    eroded_image = cv2.erode(image, kernel, iterations=1)  # iterations 为迭代次数(执行了多少次操作)
    
    # 膨胀操作 cv2.dilate()
    dilated_image = cv2.dilate(image, kernel, iterations=1)
    
    # cv2.morphologyEx() 函数用于执行更复杂的形态学操作,如开运算和闭运算
    # 开运算:先腐蚀后膨胀  cv2.MORPH_OPEN()
    opening_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)
    
    # 闭运算:先膨胀后腐蚀  cv2.MORPH_CLOSE()
    closing_image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
    
    # 显示结果
    cv2.imshow('Original Image', image)
    cv2.imshow('Eroded Image', eroded_image)
    cv2.imshow('Dilated Image', dilated_image)
    cv2.imshow('Opening Image', opening_image)
    cv2.imshow('Closing Image', closing_image)
    
    # 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图如下
    在这里插入图片描述

  • 腐蚀图(左)与膨胀图(右)
    在这里插入图片描述

  • 开运算图(左)与闭运算图(右)
    在这里插入图片描述

三、高级运算

1.简单介绍

  • 基于上述基本运算,还可以推导出多种高级形态学运算方法,如形态学梯度、顶帽变换、底帽变换等。

    • 形态学梯度(Morphological Gradient):通过膨胀和腐蚀操作的差异,可以得到图像边缘的强度信息,有助于边缘检测
    • 顶帽变换:先将图像进行开运算(先腐蚀后膨胀),然后将原始图像与开运算结果相减,作用与应用如下:
      • 顶帽变换能够突出原始图像中比周围区域更明亮的小尺度细节或亮度变化。
      • 常用于增强图像的局部对比度,以突出微小的细节,如血管、细胞核等。
      • 在医学图像分析(如血管和细胞核分割)以及纹理分析中发挥重要作用。
    • 黑帽变换:先将图像进行闭运算(先膨胀后腐蚀),然后用闭运算结果减去原始图像 ,作用与应用如下:
      • 黑帽变换能够突出原始图像中比周围区域更暗的小尺度细节或亮度变化。
      • 常用于检测图像中的小暗斑点或小暗物体,以及用于凸显亮背景上的暗物体。
      • 在图像增强、缺陷检测、文字识别等领域有广泛应用。

2.代码实现

  • 形态学梯度运算代码实现

    """梯度运算"""
    # 读取图片
    wenzi = cv2.imread('wenzi.png')
    
    # 定义结构元素
    # 这里使用2x2的正方形结构元素
    kernel = np.ones((2, 2), np.uint8)
    
    # 膨胀
    pz_wenzi = cv2.dilate(wenzi, kernel, iterations=2)
    # 腐蚀
    fs_wenzi = cv2.erode(wenzi, kernel, iterations=2)
    
    # 膨胀 - 腐蚀  cv2.MORPH_GRADIENT
    TiDu_wenzi = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
    
    # 显示图片
    cv2.imshow('yuantu_wenzi', wenzi)
    cv2.imshow('pz_wenzi', pz_wenzi)
    cv2.imshow('fs_wenzi', fs_wenzi)
    cv2.imshow('TiDu_wenzi', TiDu_wenzi)
    
    # 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图
    在这里插入图片描述

  • 膨胀(左)、腐蚀(中)、形态学梯度运算(膨胀 - 腐蚀)(右)
    在这里插入图片描述

  • 顶帽和黑帽代码实现

    """顶帽和黑帽"""
    # 顶帽 = 原始图片 - 开运算结果(先腐蚀后膨胀)
    # 黑帽 = 原始图片 - 闭运算结果(先膨胀后腐蚀)
    
    # 读取图片
    sun = cv2.imread('sun.png')
    
    # 定义结构元素
    # 这里使用3x3的正方形结构元素
    kernel = np.ones((3, 3), np.uint8)
    
    # 开运算
    sun_open = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
    # 闭运算
    sun_close = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
    
    # 顶帽  cv2.MORPH_TOPHAT
    tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
    
    # 黑帽  cv2.MORPH_BLACKHAT
    blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
    
    # 显示图片
    cv2.imshow('sun_yuantu', sun)
    cv2.imshow('sun_open', sun_open)
    cv2.imshow('sun_close', sun_close)
    cv2.imshow('TOPHAT', tophat)
    cv2.imshow('blackhat', blackhat)
    
    # 等待任意键按下后关闭所有窗口
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 原图
    在这里插入图片描述

  • 开运算(左)与顶帽(右)
    在这里插入图片描述

  • 闭运算(左)与黑帽(右)
    在这里插入图片描述


http://www.kler.cn/a/293436.html

相关文章:

  • Elasticsearch 8.16:适用于生产的混合对话搜索和创新的向量数据量化,其性能优于乘积量化 (PQ)
  • 【MySQL 保姆级教学】事务的隔离级别(详细)--下(13)
  • Elasticsearch 实战应用:高效搜索与数据分析
  • Vector Optimization – Stride
  • 性能优化、安全
  • 【云计算解决方案面试整理】1-2云计算基础概念及云计算技术原理
  • OpenGL GLFW OIT 实现
  • javaEE-多线程(3)
  • 亿佰特-NT1/NT1-B串口转RJ45以太网模块
  • python 实现newton raphson牛顿-拉夫森算法
  • 在Go语言中,不同类型之间转换的一些主要方法:
  • [数据集][目标检测]灭火器检测数据集VOC+YOLO格式3255张1类别
  • Java设计模式【备忘录模式】-行为型
  • 鸿蒙系统之ArkTs布局组件
  • Ansible在CentOS下批量部署Nginx到Kubernetes集群
  • 认识meson 的使用
  • 卷积神经网络(一)
  • 大端模式和小端模式
  • linux安装composer
  • 关于Vscode的vscode-cpptools中的icph占用c盘内存过大问题
  • 分享一个使用智狐联创AI平台创建的WordPress分类广告插件
  • GDB快捷键问答之04 怎样查看内存块
  • 【学术会议征稿】2024年第十届机械制造技术与工程材料国际学术会议(ICMTEM 2024)
  • Datawhale X 李宏毅苹果书 AI夏令营 入门 Task3-机器学习框架
  • Java - 通过枚举避免大量 if-else
  • 目标检测常见数据集格式