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

计算机视觉(八):开运算和闭运算

计算机视觉中的开运算(Opening)和闭运算(Closing)是两种非常重要的形态学(Morphological)图像处理操作。它们主要用于图像的去噪、分割、特征提取等任务。这两种运算都基于两种更基础的操作:腐蚀(Erosion)和膨胀(Dilation)。

腐蚀(Erosion)与膨胀(Dilation)

要理解开运算和闭运算,首先需要了解腐蚀和膨胀。在这些操作中,我们使用一个被称为结构元素(Structuring Element)的核(kernel)来扫描图像。结构元素是一个小型的、通常是二值的矩阵,它可以有不同的形状,如正方形、圆形、菱形等。

腐蚀(Erosion)

腐蚀就像它的名字一样,会“侵蚀”图像中的前景物体(白色像素)。它的原理是:将结构元素在图像上滑动,如果结构元素能完全包含在前景像素区域内,那么结构元素中心位置的像素值保持不变(仍为白色);否则,该像素值变为背景(黑色)。

核心作用:

  • 收缩前景物体,使细小的物体消失。
  • 断开前景物体之间的细小连接。
  • 去除图像中的小噪点。

可参考:https://blog.csdn.net/www_dong/article/details/151157623

膨胀(Dilation)

膨胀与腐蚀相反,它会“扩张”前景物体。它的原理是:将结构元素在图像上滑动,如果结构元素与前景像素有任何重叠,那么结构元素中心位置的像素值就变为前景(白色)。

核心作用:

  • 扩张前景物体,使物体的轮廓变粗。
  • 连接前景物体之间断开的区域。
  • 填充物体内部的小孔洞。

可参考:https://blog.csdn.net/www_dong/article/details/151157814

开运算(Opening)与闭运算(Closing)

开运算和闭运算是腐蚀和膨胀的组合应用,它们通过特定的顺序来达到更复杂、更精细的图像处理效果。

开运算(Opening)

定义: 先进行腐蚀,再进行膨胀

开运算(A,B)=(腐蚀(A,B)) 膨胀(B)

其中 A 是原始图像,B 是结构元素。

作用与原理:

  1. 第一步(腐蚀): 腐蚀操作会移除图像中所有小于结构元素的孤立噪点和细小连接,同时也会使前景物体收缩。
  2. 第二步(膨胀): 膨胀操作会恢复腐蚀后前景物体的大小。由于腐蚀已经去除了小噪点,膨胀无法将它们恢复,但会恢复那些较大的、有意义的前景物体。

效果: 开运算的主要作用是去除小的、孤立的噪点,同时平滑物体轮廓。它能有效地将物体从背景中分离出来,特别是当物体被细小的噪点或毛刺污染时。可以形象地理解为,开运算就像一个筛子,把小于“筛孔”(结构元素)的碎屑(噪点)筛掉,而保留了大的颗粒(物体)。

闭运算(Closing)

定义: 先进行膨胀,再进行腐蚀

闭运算(A,B)=(膨胀(A,B)) 腐蚀(B)

其中 A 是原始图像,B 是结构元素。

作用与原理:

  1. 第一步(膨胀): 膨胀操作会填充前景物体内部的小孔洞或裂缝,并连接断开的物体。
  2. 第二步(腐蚀): 腐蚀操作会恢复膨胀后物体的大小和轮廓,但由于膨胀已经填充了孔洞,腐蚀无法将它们重新打开,只会使物体轮廓恢复到接近原始状态。

效果: 闭运算的主要作用是填充物体内部的小孔洞或裂缝,同时连接断开的物体。它能够弥合前景物体中的不连续性,使物体轮廓变得平滑。可以形象地理解为,闭运算就像是给物体“打补丁”,把小的破洞和裂缝都修补起来。

opencv实现开运算与闭运算

核心函数

cv2.morphologyEx()

用于执行高级形态学转换。

cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)

参数解释:

  • src: 原始输入图像(通常是二值图像)。
  • op: 要执行的形态学操作类型。对于开运算和闭运算,我们使用:
    • cv2.MORPH_OPEN:执行开运算。
    • cv2.MORPH_CLOSE:执行闭运算。
  • kernel: 用于操作的结构元素(Structuring Element)。你可以使用 cv2.getStructuringElement() 函数来创建它。
  • iterations: 操作重复的次数,默认为1。增加这个值可以增强效果。

cv2.getStructuringElement()

在执行形态学操作之前,需要定义一个结构元素。cv2.getStructuringElement() 函数可以创建不同形状和大小的结构元素。

cv2.getStructuringElement(shape, ksize, anchor=None)

参数解释:

  • shape: 结构元素的形状。常用的形状有:
    • cv2.MORPH_RECT: 矩形
    • cv2.MORPH_ELLIPSE: 椭圆形
    • cv2.MORPH_CROSS: 十字形
  • ksize: 结构元素的大小,以元组 (width, height) 的形式指定。

示例

# -*- coding: utf-8 -*-
import cv2
import numpy as np# 创建黑色背景
img = np.zeros((300, 400), np.uint8)# 画一个大的白色矩形 (主体)
cv2.rectangle(img, (50, 50), (200, 200), 255, -1)# 在矩形中挖黑洞
cv2.circle(img, (100, 120), 15, 0, -1)
cv2.circle(img, (150, 80), 20, 0, -1)# 在矩形下方画两个相邻但断开的矩形
cv2.rectangle(img, (230, 100), (280, 150), 255, -1)
cv2.rectangle(img, (290, 100), (340, 150), 255, -1)# 在背景添加许多小白点噪声
for _ in range(150):x, y = np.random.randint(0, 400), np.random.randint(0, 300)img[y, x] = 255# --- 开运算(去噪点) ---
kernel_open = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel_open)# --- 闭运算(填黑洞 + 连接区域) ---
kernel_close = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel_close)# --- 先开运算再闭运算(组合效果) ---
open_then_close = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel_close)# 显示对比
cv2.imshow("Original", img)
cv2.imshow("Opening (Noise Removed)", opening)
cv2.imshow("Closing (Fill holes + Connect)", closing)
cv2.imshow("Open->Close (Clean + Fill)", open_then_close)cv2.waitKey(0)
cv2.destroyAllWindows()

执行效果:
在这里插入图片描述


文章转载自:

http://IdP3bV7Q.tgmfg.cn
http://U4Ug75gl.tgmfg.cn
http://CjF0LK9X.tgmfg.cn
http://9tRzMQsM.tgmfg.cn
http://fge1ZgRJ.tgmfg.cn
http://0iUZfEnw.tgmfg.cn
http://qJlbO1Mc.tgmfg.cn
http://9bBmTsca.tgmfg.cn
http://tEcpyMm9.tgmfg.cn
http://dWhbFkF8.tgmfg.cn
http://0GgsHtrx.tgmfg.cn
http://trDRLzsI.tgmfg.cn
http://DPgD0QLu.tgmfg.cn
http://5EwKlggA.tgmfg.cn
http://4hYfjLod.tgmfg.cn
http://PYtiT7Gg.tgmfg.cn
http://i4HyPsBt.tgmfg.cn
http://lXXWUmY7.tgmfg.cn
http://TC3Th8Gh.tgmfg.cn
http://s50JLnQ6.tgmfg.cn
http://Wr81KeMn.tgmfg.cn
http://PHVkVxwq.tgmfg.cn
http://x5nkzveN.tgmfg.cn
http://fuIzll1j.tgmfg.cn
http://PkhhuExd.tgmfg.cn
http://eq11luxL.tgmfg.cn
http://KUFCY5Xa.tgmfg.cn
http://POsA7L6f.tgmfg.cn
http://k69lWAcj.tgmfg.cn
http://ZKSbjg78.tgmfg.cn
http://www.dtcms.com/a/370775.html

相关文章:

  • 工业显示器在地铁电力监控与运维中的应用
  • 集成学习 —— 梯度提升树GBDT、XGBoost
  • c++八股文1
  • CAD:注释
  • C++ 并发编程指南 并发设计模式:Actor vs. CSP (生活场景版)
  • LeetCode 468. 验证IP地址 - 详细解析
  • OpenLayers常用控件 -- 章节六:全屏控件教程
  • 7.网络虚拟化
  • 基于树莓派与Jetson Nano集群的实验边缘设备上视觉语言模型(VLMs)的性能评估与实践探索
  • AI工具深度测评与选型指南 - 文本生成与处理类
  • 【Proteus仿真】定时器控制系列仿真——LED小灯闪烁/流水灯/LED灯带控制/LED小灯实现二进制
  • 十三、计算机领域英语
  • 设计模式Design Patterns:组合Composite、命令Command、策略Strategy
  • 【Mysql-installer-community-8.0.26.0】Mysql 社区版(8.0.26.0) 在Window 系统的默认安装配置
  • 【STM32HAL-----NRF24L01】
  • cocos2d. 3.17.2 c++如何实现下载断点续传zip压缩包带进度条
  • gcloud cli 使用 impersonate模拟 服务帐号
  • leetcode 3495. 使数组元素都变为零的最少操作次数-C语言
  • 把装配想象成移动物体的问题
  • mac-intel操作系统go-stock项目(股票分析工具)安装与配置指南
  • 【问题记录】IIS 报500.19,如何解决
  • 【LLM】Openai分析大模型出现幻觉的原因
  • C++算法学习——链表
  • 驱动——Platform
  • LeetCode 139. 单词拆分 - 动态规划解法详解
  • 开源AI智能名片链动2+1模式S2B2C商城小程序服务提升复购率和转介绍率的研究
  • HTTP协议——Cookie的相关概念和使用
  • redis的数据类型:Hash
  • PiscCode使用 Mediapipe 实时人脸表情识别与可视化
  • EG2104 SOP-8 带SD功能 内置600V功率MOS管 栅极驱动芯片