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

计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)


图像形态学

在图像处理中,形态学(Morphology) 是一种基于图像中物体形状的处理方法,通常用于二值图像和灰度图像。它通过腐蚀、膨胀等基本操作,结合开运算、闭运算、梯度运算、顶帽、黑帽等派生操作,来实现去噪、边缘检测、连接或断开物体等目的。

在 OpenCV 中,常用函数有:

  • cv2.erode() —— 腐蚀

  • cv2.dilate() —— 膨胀

  • cv2.morphologyEx() —— 各类高级形态学操作(开运算、闭运算、梯度、顶帽、黑帽)

准备图片:

sun.png

wenzi.png

zhiwen.png

zhiwen_duan.png


1. 图像腐蚀(Erosion)

原理

腐蚀操作的本质是:取局部最小值
在二值图像中,腐蚀会“侵蚀”白色区域(前景),使得物体的边界缩小,细小的高亮噪点被去除。

公式:

即:结构元素 B 在图像 A 上滑动,若完全落在前景内,则该像素保留,否则被侵蚀。

OpenCV 函数

cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
  • src:输入图像

  • kernel:卷积核(结构元素),默认为 3×3 矩形

  • iterations:迭代次数,越大腐蚀越明显

参数名默认值类型 / 取值作用说明
src必填图像对象输入图像,可以是二值图、灰度图或彩色图。
kernelNone(默认 3×3 矩形)numpy.ndarray卷积核(结构元素),决定腐蚀范围和形状。
dstNone图像对象输出图像,和 src 类型、大小相同。通常不写,函数会返回结果。
anchor(-1,-1)(核中心)(x,y) 坐标核的参考点位置。默认在中心。
iterations1整数腐蚀迭代次数,数值越大,腐蚀越严重。
borderTypecv2.BORDER_CONSTANTOpenCV 边界模式边界扩展方式。- BORDER_CONSTANT 常数填充- BORDER_REPLICATE 复制边缘- BORDER_REFLECT 镜像填充
borderValue0(黑色)数值borderType=BORDER_CONSTANT 时使用,表示填充颜色。

代码示例

import cv2
import numpy as npsun = cv2.imread('sun.png')
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((3,3), np.uint8)  # 3×3核
erosion_1 = cv2.erode(sun, kernel, iterations=2)  # 腐蚀2次
cv2.imshow('sun_erode', erosion_1)
cv2.waitKey(0)

说明

  • 如果 kernel 改为 5×5,腐蚀会更明显。

  • 如果 iterations 改为 5,物体会被“蚕食”得更多。


2. 图像膨胀(Dilation)

原理

膨胀操作的本质是:取局部最大值
在二值图像中,膨胀会“扩张”白色区域,使得物体边界扩大,细小的黑洞被填充。

公式:

OpenCV 函数

cv2.dilate(img, kernel, iterations)
参数名默认值类型 / 取值作用说明
src必填图像对象输入图像,可以是二值图、灰度图或彩色图。
kernelNone(默认 3×3 矩形)numpy.ndarray卷积核(结构元素),决定膨胀范围和形状。
dstNone图像对象输出图像,和 src 类型、大小相同。通常不写,函数会返回结果。
anchor(-1,-1)(核中心)(x,y) 坐标核的参考点位置。默认在中心。
iterations1整数膨胀迭代次数,数值越大,膨胀越明显。
borderTypecv2.BORDER_CONSTANTOpenCV 边界模式边界扩展方式。- BORDER_CONSTANT 常数填充- BORDER_REPLICATE 复制边缘- BORDER_REFLECT 镜像填充
borderValue0(黑色)数值borderType=BORDER_CONSTANT 时使用,表示填充颜色。

代码示例

wenzi = cv2.imread('wenzi.png')
cv2.imshow('wenzi', wenzi)
cv2.waitKey(0)kernel = np.ones((2,2), np.uint8)
wenzi_new = cv2.dilate(wenzi, kernel, iterations=2)
cv2.imshow('wenzi_dilate', wenzi_new)
cv2.waitKey(0)
cv2.destroyAllWindows()

说明

  • kernel 越大,膨胀效果越明显。

  • 常用于加粗文字、填补小空洞。


morphologyEx函数

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
参数名默认值类型 / 取值作用说明
src必填图像对象输入图像,可以是二值、灰度或彩色图。
op必填整数常量指定形态学操作类型(见下表)。
kernelNone(默认 3×3 矩形)numpy.ndarray卷积核(结构元素),决定操作范围和形状。
dstNone图像对象输出图像,与 src 类型、大小相同。通常不写,函数会返回结果。
anchor(-1,-1)(核中心)(x,y) 坐标核的参考点位置。默认在中心。
iterations1整数操作迭代次数,数值越大效果越强。
borderTypecv2.BORDER_CONSTANTOpenCV 边界模式边界扩展方式。
borderValue0(黑色)数值borderType=BORDER_CONSTANT 时使用,表示填充值。

3. 开运算与闭运算

(1)开运算(Opening)

先腐蚀后膨胀

  • 作用:去除小噪点、分离粘连物体。

kernel = np.ones((2,2), np.uint8)
zhiwen = cv2.imread('zhiwen.png')
zhiwen_new = cv2.morphologyEx(zhiwen, cv2.MORPH_OPEN, kernel)
cv2.imshow('zhiwen_OPEN', zhiwen_new)

(2)闭运算(Closing)

先膨胀后腐蚀

  • 作用:填补小黑洞、连接相邻物体。(指纹断点被连接)

kernel = np.ones((4,4), np.uint8)
zhiwen_duan = cv2.imread('zhiwen_duan.png')
zhiwen_new = cv2.morphologyEx(zhiwen_duan, cv2.MORPH_CLOSE, kernel)
cv2.imshow('zhiwen_duan_CLOSE', zhiwen_new)


4. 形态学梯度(Gradient)

原理

梯度 = 膨胀 - 腐蚀
它突出显示物体的边缘区域,常用于边缘检测。

代码示例

wenzi = cv2.imread('wenzi.png', 0)
cv2.imshow('wenzi', wenzi)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)  # 设置kernel大小
# 膨胀
pz_wenzi = cv2.dilate(wenzi, kernel, iterations=1)
cv2.imshow('wenzi_dilate', pz_wenzi)
cv2.waitKey(0)# 腐蚀
fs_wenzi = cv2.erode(wenzi, kernel, iterations=1)
cv2.imshow('wenzi_erode', fs_wenzi)
cv2.waitKey(0)# 膨胀 - 腐蚀
bianyuan = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('wenzi_GRADIENT', bianyuan)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下三张图为:原图膨胀后;原图腐蚀后;原图梯度后


5. 顶帽与黑帽运算

(1)顶帽(Top Hat)

顶帽 = 原始图像 - 开运算结果

  • 突出图像中比周围亮的部分(亮斑检测)。

(2)黑帽(Black Hat)

黑帽 = 闭运算结果 - 原始图像

  • 突出图像中比周围暗的部分(暗斑检测)。

代码示例

sun = cv2.imread('sun.png', 0)
cv2.imshow('sun', sun)
cv2.waitKey(0)kernel = np.ones((2, 2), np.uint8)  # 设置kernel大小
# 开运算
open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)
cv2.imshow('sun_OPEN', open_sun)
cv2.waitKey(0)# 顶帽运算
tophat = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('sun_TOPHAT', tophat)
cv2.waitKey(0)# 闭运算
close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)
cv2.imshow('sun_CLOSE', close_sun)
cv2.waitKey(0)# 黑帽运算
blackhat = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('sun_BLACKHAT', blackhat)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下图片为:开运算、顶帽、闭运算、黑帽


总结

  • 腐蚀:缩小白色区域,去噪点。

  • 膨胀:扩大白色区域,填洞。

  • 开运算:去噪、断开。

  • 闭运算:填洞、连接。

  • 梯度:提取边缘。

  • 顶帽:突出亮斑。

  • 黑帽:突出暗斑。

形态学操作广泛应用于:

  • 图像预处理(去噪、增强特征)

  • OCR 文字识别(加粗或断开笔画)

  • 工业检测(焊点检测、缺陷检测)

  • 医学图像处理(血管提取)

http://www.dtcms.com/a/342547.html

相关文章:

  • el-table-draggable拖拽实现表格内容排序
  • VUE从入门到精通二:ref、reactive、computed计算属性、watch监听、组件之间的通信
  • 网络与信息安全有哪些岗位:(5)安全开发工程师
  • Android14内核调试 - boot vendor_boot
  • Git常用操作大全(附git操作命令)
  • Matplotlib数据可视化实战:Matplotlib数据可视化入门与实践
  • golang实现的Rsa加密解密算法(go和java交互时双向加解密方案)
  • OpenCV 形态学操作详解:腐蚀、膨胀与开闭运算
  • Chrome/360 浏览器 WebUI 资源底层机制解析:共享资源与专属资源的奥秘
  • 一、部署LNMP
  • mac的m3芯片安装JDK8、JDK17
  • 【CDA干货】金融App产品AB测试与指标体系搭建
  • 数据结构之排序大全(3)
  • 31、工业网络异常行为检测与OT协议深度分析 (核电站DCS模拟) - /安全与维护组件/network-anomaly-detection-nuclear
  • “码” 上安全:轻量级加密的硬件实现与侧信道攻击防御
  • Java实现一个简单的LRU缓存对象
  • 【SpringBoot】16 核心功能 - Web开发原理 - 请求参数 - 源码分析
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析七
  • 如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
  • CTFshow系列——命令执行web41-44
  • YOLOv8 原理与跨领域应用全景分析
  • CVPR | 2025 | MAP:通过掩码自回归预训练释放混合 Mamba - Transformer 视觉骨干网络的潜力
  • 【C++】仿函数和回调函数
  • Python数值取整完全指南:从基础到金融工程实践
  • uniapp实现分页,效果如图
  • 自然语言处理——04 注意力机制
  • npm全局安装后,cmd命令行可以访问,vscode访问报错
  • HTTP 403 错误:后端权限校验机制深度解析
  • 长尾关键词优化SEO核心策略
  • JeeSite 快速开发平台:全能企业级快速开发解决方案