OpenCV图像形态学的实现

2025-04-14 16:50
文章标签 实现 图像 opencv 形态学

本文主要是介绍OpenCV图像形态学的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起...

在图像处理领域,图像形态学是一种基于形状进行图像分析的有力工具,广泛应用于图像分割、特征提取、边缘检测、图像降噪等多个方面。借助 OpenCV 这个强大的计算机视觉库,我们可以轻松实现各种图像形态学操作。本文将深入探讨图像形态学的基本原理,并结合 OpenCV 的代码示例,介绍腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算等常见的形态学操作。

一、图像形态学简介

图像形态学以数学形态学为基础,通过对图像中的像素进行特定的集合运算,改变图像中物体的形状和结构。其核心操作是使用一个称为结构元素(也叫核)的小矩阵,在图像上滑动,对每个像素及其邻域进行操作,从而实现对图像的处理。在 OpenCV 中,提供了丰富的函数和工具,帮助我们进行各种图像形态学处理。

二、腐蚀(Erosion)

1. 原理

腐蚀是一种基本的图像形态学操作,其作用是 “收缩” 或 “细化” 图像中的物体。具体来说,腐蚀操作以结构元素为模板,对图像中的每个像素进行检查。如果结构元素覆盖的所有像素都为 1(对于二值图像而言),则中心像素保持不变,否则中心像素被设置为 0。通俗地讲,腐蚀操作会将物体的边界向内部收缩,从而去除图像中的一些小的噪声点和毛刺。例如,对于一个白色物体在黑色背景上的二值图像,腐蚀操作会使白色物体的面积变小。

2. OpenCV 实现

在 OpenCV 中,使用cv2.erode()函数实现腐蚀操作。该函数的第一个参数为输入图像,第二个参数为结构元素,第三个参数为迭代次数(可选,默认为 1)。下面通过一个简单的示例来展示如何使用cv2.erode()进行腐蚀操作:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行腐蚀操作
eroded = cv2.erode(img, kernel, iterations = 1)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(eroded, cmap = 'gray'), plt.title('Eroded')
plt.xticks([]), plt.yticks([])
plt.show()

三、膨胀(Dilation)

1. 原理

膨胀是与腐蚀相反的操作,其作用是 “扩展” 或 “加粗” 图像中的物体。膨胀操作同样以结构元素为模板,对图像中的每个像素进行检查。只要结构元素覆盖的像素中有一个为 1(对于二值图像而言),则中心像素被设置为 1。膨胀操作可以填补图像中的小空洞,连接断裂的物体,扩大物体的面积。例如,在检测物体轮廓时,膨胀操作可以帮助我们更完整地获取物体的轮廓。

2. OpenCV 实现

在 OpenCV 中,使用cv2.dilate()函数实现膨胀操作。该函数的参数与cv2.erode()类似,第一个参数为输入图像,第二个参数为结构元素,第三个参数为迭代次数(可选,默认为 1)。下面是使用cv2.dilate()进行膨胀操作的示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行膨胀操作
dilated = cv2.dilate(img, kernel, iterations = 1)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(dilated, cmap = 'grazGVLltzy'), plt.title('Dilated')
plt.xticks([]), plt.yticks([])
plt.show()

四、开运算(Opening)

1. 原理

开运算由腐蚀和膨胀两个操作组成,先对图像进行腐蚀操作,再进行膨胀操作。开运算可以去除图像中的小噪声点,平滑物体的轮廓,断开狭窄的连接,而不会明显改变物体的面积。对于含有噪声的二值图像,开运算能够有效地去除噪声,保留主要的物体结构。

2. OpenCV 实现

在 OpenCV 中,使用cv2.morphologyEx()函数并指定操作类型为cv2.MORPH_OPEN来实现开运算。该函数的第一个参数为输入图像,第二个参数为操作类型,第三个参数为结构元素。以下是实现开运算的示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行开运算
opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(opened, cmap = 'gray'), plt.title('Opened')
plt.xticks([]), plt.yticks([])
plt.show()

五、闭运算(Closing)

1. 原理

闭运算同样由腐蚀和膨胀两个操作组成,但顺序与开运算相反,先进行膨胀操作,再进行腐蚀操作。闭运算可以填补物体内部的小空洞,连接邻近的物体,平滑物体的轮廓,同时保持物体的整体形状和面积。在处理含有孔洞的物体图像时,闭运算能够有效地填补孔洞,使物体的形状更加完整。

2. OpenCV 实现

在 OpenCV 中,使用cv2.morphologyEx()函数并指定操作类型为cv2.MORPH_CLOSING来实现闭运算。示例代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行闭运算
closed = cv2.morphologyEx(img, cv2.MORPH_CLOSING, kernel)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(closed, cmap = 'gray'), plt.title('Closed')
plt.xticks([]), plt.yticks([])
plt.show()

六、梯度运算(Morphological Gradient)

1. 原理

形态学梯度运算通过膨胀和腐蚀操作的差值来获取图像中物体的轮廓。具体来说,梯度运算的结果等于膨胀后的图像减去腐蚀后的图像。这样可以突出图像中物体的边缘,使物体的轮廓更加明显。形态学梯度运算常用于边缘检测和物体形状的提取。

2. OpenCV 实现

在 OpenCV 中,使用cv2.morphologyEx()函数并指定操作类型为cv2.MORPH_GRADIENT来实现梯度运算。示例代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行梯度运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(gradient, cmap = 'gray'), plt.title('Gradient')
plt.xticks([]), plt.yticks([])
plt.show()

七、顶帽运算(Top - Hat)

1. 原理

顶帽运算,也叫礼帽运算,其结果为原始图像与图像开运算的差值。即顶帽图像 = 原始图像 - 开运算图像。开运算会平滑物体轮廓、去除小噪声,但也会使图像中较亮的部分有所损失。顶帽运算能够分离出比邻近点亮一些的斑块,突出图像中的微小细节,在提取图像中的明亮区域或噪声方面非常有用。例如,在文本检测中,顶帽运算可以帮助突出文本的细节。

2. OpenCV 实现

在 OpenCwww.chinasem.cnV 中,通过cv2.morphologyEx()函数并指定操作类型为cv2.MORPH_TOPHAT来实现顶帽运算。下面是实现顶帽运算的代码示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行顶帽运算
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(tophat, cmap = 'gray'), plt.title('Top - Hat')
plt.xticks([]), plt.yticks([])
plt.show()

八、黑帽运算(Black - Hat)

1. 原理

黑帽运算与顶帽运算相对,其结果为图像闭运算与原始图像的差值。即黑帽图像 = 闭运算图像 - 原始图像。闭运算能够填补物体内部的小空洞、连接邻近物体。黑帽运算有助于分离出比邻近点暗一些的斑块,突出图像中相对较暗的区域,在检测图像中的暗细节或背景特征时十分有效。比如在检测深色物体时,黑帽运算能帮助增强物体的特征。

2. OpenCV 实现

在 OpenCV 中,通过cv2.morphologyEx()函数并指定操作类型为cv2.MORPH_BLACKHAT来实现黑帽运算。代码示例如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像并转换为灰度图
img = cv2.imread('test.jpg', 0)
# 创建结构元素,这里使用5x5的矩形结构元素
kernel = np.ones((5, 5), np.uint8)
# 进行黑帽运算
blackhat = cv2.morpholandroidogyEx(img, cv2.MORPH_BLACKHAT, kernel)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap = 'gray'), plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(blackhat, cmap = 'gray'), plt.title('Black - Hat')
plt.xticks([]), plt.yticks([])
plt.show()

九、总结

本文详细介绍了 OpenCV 中的图像形态学处理技术,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算。每种操作都有其独特的原理和适用场景。腐蚀和膨胀是基础操作,开运算、闭运算、顶帽运算和黑帽运算基于它们组合而成,用于不同的图像特征提取与处理。梯度运算则专注于突出物体边缘。在实际应用中,我们可以根据图像的特点和处理需求,灵活组合这些形态学操作,达到最佳的处理效果。

到此这篇关于OpenCV图像形态学的实现的文章就介绍到这了,更多相关OpenCV图像形态学内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程python栈(www.chinasem.cn)!

这篇关于OpenCV图像形态学的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154215

相关文章

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构