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

图像处理|闭运算

闭运算(Closing)是形态学操作中的另一种基本操作,它与开运算(Opening)类似,但执行的步骤相反。闭运算结合了膨胀腐蚀操作,顺序为 先膨胀后腐蚀。这种操作通常用于填补图像中的小空洞,同时去除细小的黑色噪声

闭运算具体过程:

  1. 膨胀操作:将图像中的白色区域扩展,填补小的黑色区域或间隙。
  2. 腐蚀操作:膨胀之后,对图像进行腐蚀,减少过多的边界,保持物体的形状。

闭运算的效果是填补图像中的小空洞、消除小黑点噪声等。

闭运算的作用

  1. 填补小的黑色空洞:闭运算可以填补物体内部的小空洞和裂缝,使物体更加连贯。
  2. 去除小的白色噪声:可以去除图像中的一些小白噪声点。
  3. 平滑图像边缘:闭运算会略微平滑物体的边缘,同时保持物体的整体形态。

在 OpenCV 中的实现

OpenCV提供了cv2.morphologyEx函数来实现形态学操作,包括闭运算。我们可以通过参数 cv2.MORPH_CLOSE 来进行闭运算。

主要函数

cv2.morphologyEx(src, op, kernel)
  • src:输入图像(通常是二值图像)。
  • op:形态学操作的类型,例如 cv2.MORPH_CLOSE 代表闭运算。
  • kernel:结构元素,定义了操作的范围和形状。

代码示例

以下代码演示了如何使用 OpenCV 实现闭运算去除白色方块中的黑色噪点。

import cv2
import numpy as np

image = cv2.imread('./noise.png')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, threshed = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
print(threshed.shape)
k = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
closed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, k)
stack_img = np.hstack((image, closed))
cv2.imshow('img', stack_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

解释

  • 原图像:包含小的黑色空洞或噪声点。
  • 闭运算结果:通过先膨胀再腐蚀的方式,填补了物体内部的小空洞,并去除了小的噪声点。

结构元素的选择

在闭运算中,结构元素(kernel)的形状和大小会影响最终的结果。常见的结构元素有:

  • 矩形结构元素cv2.MORPH_RECT
  • 椭圆形结构元素cv2.MORPH_ELLIPSE
  • 交叉形结构元素cv2.MORPH_CROSS

可以根据实际需要选择不同形状的结构元素:

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))

应用场景

  1. 填补物体中的小空洞:闭运算常用于图像中物体的细节处理,尤其是填补物体中间的小空洞或裂缝,使物体看起来更加连贯。
  2. 去除小型噪声点:通过先膨胀后腐蚀,能够有效去除小的白色噪声点(在黑色背景上的小白点)。
  3. 图像的边界平滑:在图像的边缘进行平滑处理,同时保持整体形状。
  4. 增强图像特征:通过闭运算增强图像中的结构,尤其是在物体识别或图像分割前的预处理阶段。

常见问题与优化

  1. 选择合适的结构元素大小

    • 结构元素的大小决定了闭运算操作的强度。若选择太小的结构元素,可能无法有效填补空洞;若选择过大的结构元素,可能会导致边界的过度扩展。
    # 创建一个较大的结构元素,适合更大区域的填补 
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 15))
  2. 处理彩色图像

    • 对彩色图像进行闭运算时,可以对每个通道(例如RGB三个通道)分别进行操作,或者将图像转换为灰度图后进行处理。
    import cv2
    import numpy as np
    
    image = cv2.imread("frame.jpg")
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    channels = cv2.split(image)
    processed_channels = [cv2.morphologyEx(ch, cv2.MORPH_CLOSE, kernel) for ch in channels]
    result = cv2.merge(processed_channels)
    
    stack = np.hstack((image, result))
    cv2.imshow('img', stack)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

总结

闭运算是形态学操作中的一个重要步骤,它通过先膨胀再腐蚀的方式,在填补图像小空洞的同时去除噪声点。它在图像预处理、物体分割和特征增强等领域具有广泛的应用。通过合理选择结构元素的大小与形状,闭运算能够高效处理各种图像问题。


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

相关文章:

  • NumPy;NumPy在数据分析中的应用;NumPy与其他库的搭配使用
  • 嵌入式杂谈——什么是DMA?有什么用?
  • MarsCode青训营打卡Day1(2025年1月14日)|稀土掘金-16.最大矩形面积问题
  • Web渗透测试之伪协议与SSRF服务器请求伪装结合? 能产生更多的效果
  • 【全面解析】深入解析 TCP/IP 协议:网络通信的基石
  • 在Mac mini上实现本地话部署AI和知识库
  • 2025.1.16——三、supersqli 绕过|堆叠注入|handler查询法|预编译绕过法|修改原查询法
  • 快慢指针:链表问题的利器
  • unity免费资源2025-1-17
  • Java合并多个List集合的方法
  • AUTOSAR从入门到精通专栏总目录
  • Linux手写FrameBuffer任意引脚驱动spi屏幕
  • Django多线程爬虫:突破数据抓取瓶颈
  • sparkRDD教程之必会的题目
  • Oracle graph 图数据库体验-安装篇
  • 一文简要了解为什么需要RAG、核心原理与应用场景
  • 陈萍的设计创新:Kevlin Nexus荣获伦敦设计奖,展示品牌设计的国际化与持续创新
  • 【12】Word:张老师学术论文❗
  • 专业130+总分410+西安交通大学815/869原909信号与系统考研电子信息与通信工程。真题,大纲,参考书。
  • 云IDE:开启软件开发的未来篇章
  • 用大白话讲明白JWT
  • Node.js - Express框架
  • Android 实现多语言功能
  • 从零开始:Gitee 仓库创建与 Git 配置指南
  • Temp123
  • 在MyBatis的XML映射文件中,<trim>元素所有场景下的完整使用示例