OpenCV:闭运算

目录

[1. 简述](#1. 简述)

[2. 用膨胀和腐蚀实现闭运算](#2. 用膨胀和腐蚀实现闭运算)

[2.1 代码示例](#2.1 代码示例)

[2.2 运行结果](#2.2 运行结果)

[3. 闭运算接口](#3. 闭运算接口)

[3.1 参数详解](#3.1 参数详解)

[3.2 代码示例](#3.2 代码示例)

[3.3 运行结果](#3.3 运行结果)

[4. 闭运算的应用场景](#4. 闭运算的应用场景)

[5. 注意事项](#5. 注意事项)


相关阅读

OpenCV:图像的腐蚀与膨胀-CSDN博客

OpenCV:开运算-CSDN博客


1. 简述

简而言之:闭运算 = 膨胀 + 腐蚀

闭运算 是一种形态学操作,用于填补前景物体中的小孔洞、连接断裂部分以及平滑前景边缘。

它的操作顺序是:

  1. 膨胀:先扩展前景物体,使前景变大。
  2. 腐蚀:再缩小前景物体,恢复形状。

闭运算的作用可以概括为:

  • 填补前景中的小空隙。
  • 连接相近的前景区域。
  • 平滑边界。

数学表达式为:

其中:

  • A 是输入图像。
  • B 是卷积核。
  • ⊕ 表示膨胀操作。
  • ⊖ 表示腐蚀操作。

2. 用膨胀和腐蚀实现闭运算

2.1 代码示例

python 复制代码
import cv2
import numpy as np

image = cv2.imread('D:\\resource\\filter\\q4.jpg')

# 卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

# 膨胀操作
result1 = cv2.dilate(image, kernel, iterations=1)

# 腐蚀操作
result2 = cv2.erode(result1, kernel, iterations=1)

# 显示原始图像、闭运算(膨胀 + 腐蚀)图像
cv2.imshow('image', image)
cv2.imshow('result2', result2)

cv2.waitKey(0)
cv2.destroyAllWindows()

2.2 运行结果

从左到右:

  • 原始黑底白字图像,白字内部带一些黑色的噪点。
  • 图像进行膨胀、腐蚀之后的结果,内部黑色噪点消失。

3. 闭运算接口

在 OpenCV 中,闭运算由函数 cv2.morphologyEx() 实现,其关键参数如下:

python 复制代码
cv2.morphologyEx(src, op, kernel, dst=None, anchor=(-1, -1), iterations=1, borderType=cv2.BORDER_CONSTANT, borderValue=0)

3.1 参数详解

  • src:输入图像。通常是二值化图像或灰度图像。
  • op:操作类型,闭运算的标识符为 cv2.MORPH_CLOSE。
  • kernel:结构元素(卷积核),决定形态学操作的范围和形状。
  • dst:输出图像。默认为 None。
  • anchor:结构元素的锚点,默认为 (-1, -1),即以核的中心为锚点。
  • iterations:操作的迭代次数,默认为 1。
  • borderType:边界模式,定义图像边界的填充方式,常用 cv2.BORDER_CONSTANT。
  • borderValue:边界值,仅在 borderType 为 cv2.BORDER_CONSTANT 时使用。

常用的参数为前3个:

python 复制代码
cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

3.2 代码示例

python 复制代码
import cv2
import numpy as np

image = cv2.imread('D:\\resource\\filter\\q4.jpg')

# 卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

# 膨胀操作
#result1 = cv2.dilate(image, kernel, iterations=1)

# 腐蚀操作
#result2 = cv2.erode(result1, kernel, iterations=1)

# 闭运算
result2 = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

# 显示原始图像、闭运算(膨胀 + 腐蚀)图像
cv2.imshow('image', image)
cv2.imshow('result2', result2)

cv2.waitKey(0)
cv2.destroyAllWindows()

3.3 运行结果


4. 闭运算的应用场景

  • 填补前景中的小孔洞:闭运算可以有效填补前景区域中的小空洞,从而使目标更加完整。
  • 连接断裂的前景区域:当前景物体存在细小的断裂区域时,闭运算可以将其连接起来。
  • 平滑前景边界:通过闭运算,前景的边界可以变得更加平滑,去除不必要的凹陷。

5. 注意事项

  • 核的大小:选择适当的核大小尤为重要,过大或过小的核可能会导致处理效果不佳。
  • 输入图像类型:通常对二值化图像进行闭运算效果更明显。
  • 迭代次数:可以通过调整迭代次数来进一步增强效果。
相关推荐
小爷毛毛_卓寿杰18 小时前
我把一个 3B 模型塞进了 Xinference,然后它干掉了 DeepSeek V3.2
人工智能·开源·github
秦先生在广东18 小时前
Agent 闭环才是真正的护城河:Anthropic “300 个 Agent“ 背后被忽视的秘密
人工智能
Bigfish_coding18 小时前
前端转agent-【python】- 14 记忆系统优化:摘要与遗忘
人工智能
Bigfish_coding19 小时前
前端转agent-【python】-13 Ollama Python流式输出教程:stream=True 与 async 实践
人工智能
字节跳动数据库21 小时前
文章分享——相似函数处理方法
人工智能·后端·程序员
Bigfish_coding21 小时前
前端转agent-【python】-12 LangChain 入门实战:RAG + LCEL 链式调用
人工智能
程序员cxuan21 小时前
读懂 Claude Code 架构分析系列,第一篇,开始!
人工智能·后端·架构
饼干哥哥1 天前
扣子3.0测评:我让 Codex 和 Claude Code 住同一个桌面,结果它们打架了!
人工智能·开源·代码规范
Token炼金师1 天前
IP-Adapter:解耦交叉注意力如何让扩散模型看见图像
人工智能
Bigfish_coding1 天前
前端转agent-【python】-11 LangGraph 高级特性:时间旅行与人工介入
人工智能