欢迎来到徐庆高(Tea)的个人博客网站
磨难很爱我,一度将我连根拔起。从惊慌失措到心力交瘁,我孤身一人,但并不孤独无依。依赖那些依赖我的人,信任那些信任我的人,帮助那些给予我帮助的人。如果我愿意,可以分裂成无数面镜子,让他们看见我,就像看见自己。察言观色和模仿学习是我的领域。像每个深受创伤的人那样,最终,我学会了随遇而安。
当前位置: 日志文章 > 详细内容

OpenCV 形态学变换的实现示例

2025年07月09日 Python
一、引言在计算机视觉领域,形态学变换是一种基于图像形状的简单操作,常用于图像预处理、特征提取等任务。opencv 作为一个强大的计算机视觉库,提供了丰富的形态学变换函数。本文将详细介绍 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 形态学变换内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!