OpenCV 形态学变换的实现示例

 更新时间:2025年07月09日 09:53:47   作者:PyAIExplorer  
本文主要介绍了使用OpenCV进行常见的形态学变换操作,这些操作在图像预处理、特征提取等任务中非常有用,具有一定的参考价值,感兴趣的可以了解一下

一、引言

在计算机视觉领域,形态学变换是一种基于图像形状的简单操作,常用于图像预处理、特征提取等任务。OpenCV 作为一个强大的计算机视觉库,提供了丰富的形态学变换函数。本文将详细介绍 OpenCV 中常见的形态学变换操作,并通过 Python 代码展示如何对一张猫咪图像进行这些操作。

二、环境准备

在运行代码之前,你需要安装 OpenCV 库。可以使用以下命令进行安装:

pip install opencv-python

三、代码实现

1. 导入必要的库

import cv2
import numpy as np

2. 腐蚀操作

腐蚀操作会使图像中的前景物体变小,通常用于去除小的噪声点。

二值图腐蚀后白色像素(非0)变少了。

# 腐蚀
def test001():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    # img_erode=cv2.erode(img,kernel=kernel,iterations=2)
    img_erode = cv2.erode(img, kernel=kernel)
    img_erode = cv2.erode(img_erode, kernel=kernel)
    cv2.imshow("img", img)
    cv2.imshow("img_erode", img_erode)
    cv2.waitKey(0)

3. 膨胀操作

膨胀操作会使图像中的前景物体变大,通常用于连接断裂的物体。

二值图膨胀后白色像素变多了。

# 膨胀
def test002():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    img_dilate = cv2.dilate(img, kernel=kernel, iterations=2)
    cv2.imshow("img", img)
    cv2.imshow("img_dilate", img_dilate)
    cv2.waitKey(0)

4. 开运算

开运算先进行腐蚀操作,再进行膨胀操作,常用于去除小的前景物体。

# 开运算:先腐蚀后膨胀
def test003():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    img_open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel=kernel)
    cv2.imshow("img", img)
    cv2.imshow("img_open", img_open)
    cv2.waitKey(0)

5. 闭运算

闭运算先进行膨胀操作,再进行腐蚀操作,常用于填充前景物体内部的小孔。

# 闭运算:先膨胀后腐蚀
def test004():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    img_close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel=kernel)
    cv2.imshow("img", img)
    cv2.imshow("img_close", img_close)
    cv2.waitKey(0)

6. 礼帽操作

礼帽操作是原始图像与开运算结果之差,常用于突出图像中的噪声点。

# 礼帽:原始图像与开运算之差
def test005():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    img_tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel=kernel)
    cv2.imshow("img", img)
    cv2.imshow("img_tophat", img_tophat)
    cv2.waitKey(0)

7. 黑帽操作

黑帽操作是闭运算结果与原始图像之差,常用于突出图像中的小孔。

# 黑帽:闭运算与原始图像之差
def test006():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    img_blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel=kernel)
    cv2.imshow("img", img)
    cv2.imshow("img_blackhat", img_blackhat)
    cv2.waitKey(0)

8. 形态学梯度操作

形态学梯度操作是膨胀结果与腐蚀结果之差,常用于突出图像的边缘。

# 形态学梯度:膨胀与腐蚀之差
def test007():
    img = cv2.imread("./opencv_work/src/cat.jpg", cv2.IMREAD_GRAYSCALE)
    kernel = np.ones((3, 3), np.uint8)
    img2 = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    cv2.imshow("img", img)
    cv2.imshow("img2", img2)
    cv2.waitKey(0)

9. 主函数调用

if __name__ == '__main__':
    # test001()
    # test002()
    # test003()
    # test004()
    # test005()
    # test006()
    test007()

四、代码解释

  • 导入库:导入了 cv2 和 numpy 库,cv2 用于图像处理,numpy 用于创建核。
  • 读取图像:使用 cv2.imread 函数读取猫咪图像,并将其转换为灰度图像。
  • 创建核:使用 np.ones 函数创建一个 3x3 的核,用于形态学变换。
  • 形态学变换:使用 cv2.erodecv2.dilate 和 cv2.morphologyEx 函数进行不同的形态学变换。
  • 显示图像:使用 cv2.imshow 函数显示原始图像和变换后的图像。
  • 等待按键:使用 cv2.waitKey 函数等待用户按下任意键关闭窗口。

五、总结

通过本文的介绍,你学会了如何使用 OpenCV 进行常见的形态学变换操作。这些操作在图像预处理、特征提取等任务中非常有用。你可以根据自己的需求选择合适的形态学变换操作,对图像进行处理。

到此这篇关于OpenCV 形态学变换的实现示例的文章就介绍到这了,更多相关OpenCV 形态学变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python去除空格和换行符的实现方法(推荐)

    python去除空格和换行符的实现方法(推荐)

    下面小编就为大家带来一篇python去除空格和换行符的实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • python入门课程第二讲之怎么运行Python

    python入门课程第二讲之怎么运行Python

    这篇文章主要介绍了python入门课程第二讲之怎么运行Python,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Python中BaseHTTPRequestHandler实现简单的API接口

    Python中BaseHTTPRequestHandler实现简单的API接口

    本文主要介绍了Python中BaseHTTPRequestHandler实现简单的API接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

    pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解

    今天小编就为大家分享一篇pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • python数组复制拷贝的实现方法

    python数组复制拷贝的实现方法

    这篇文章主要介绍了python数组复制拷贝的实现方法,实例分析了Python数组传地址与传值两种复制拷贝的使用技巧,需要的朋友可以参考下
    2015-06-06
  • Python进程间通信Queue消息队列用法分析

    Python进程间通信Queue消息队列用法分析

    这篇文章主要介绍了Python进程间通信Queue消息队列用法,结合实例形式分析了基于Queue的进程间通信相关操作技巧与使用注意事项,需要的朋友可以参考下
    2019-05-05
  • Python实现k-means算法

    Python实现k-means算法

    这篇文章主要为大家详细介绍了Python实现k-means算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • python中复数的共轭复数知识点总结

    python中复数的共轭复数知识点总结

    在本篇内容里小编给大家整理的是关于python中复数的共轭复数知识点总结,有需要的朋友们可以学习下。
    2020-12-12
  • Python编程mac下使用pycharm小技巧

    Python编程mac下使用pycharm小技巧

    这篇文章主要介绍了Python编程中在mac下使用pycharm的一些小技巧,建议正在使用Pycharm的同学们可以收藏阅读,可以节省你的编程时间
    2021-09-09
  • selenium携带cookies模拟登陆CSDN的实现

    selenium携带cookies模拟登陆CSDN的实现

    这篇文章主要介绍了selenium携带cookies模拟登陆CSDN的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论