OpenCV 形态学变换实战

一、引言

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

二、环境准备

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

bash 复制代码
pip install opencv-python

三、代码实现

1. 导入必要的库

python 复制代码
import cv2
import numpy as np

2. 腐蚀操作

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

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

python 复制代码
# 腐蚀
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. 膨胀操作

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

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

python 复制代码
# 膨胀
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. 开运算

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

python 复制代码
# 开运算:先腐蚀后膨胀
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. 闭运算

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

python 复制代码
# 闭运算:先膨胀后腐蚀
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. 礼帽操作

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

python 复制代码
# 礼帽:原始图像与开运算之差
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. 黑帽操作

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

python 复制代码
# 黑帽:闭运算与原始图像之差
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. 形态学梯度操作

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

python 复制代码
# 形态学梯度:膨胀与腐蚀之差
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. 主函数调用

python 复制代码
if __name__ == '__main__':
    # test001()
    # test002()
    # test003()
    # test004()
    # test005()
    # test006()
    test007()

四、代码解释

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

五、总结

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

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。