0
点赞
收藏
分享

微信扫一扫

【youcans 的 OpenCV 例程200篇】116. 形态学操作之闭运算


【youcans 的 OpenCV 例程 200 篇】116. 形态学操作之闭运算


形态学的基本思想是利用结构元素测量或提取输入图像中的形状或特征,以便进行图像分析和目标识别。形态学操作都是基于各种形状的结构元,结构元对输入图像进行操作得到输出图像。



2. 形态学基本操作

2.4 闭运算

闭运算就是先膨胀后腐蚀的过程,通常用于弥合狭窄的断裂和细长的沟壑,消除小孔,填补轮廓中的缝隙,消除噪点,连接相邻的部分。

结构元 B 对集合 A 的闭运算定义为:

A ∙ B = ( A ⊕ B ) ⊖ B A \bullet B = (A \oplus B) \ominus B AB=(AB)B

首先 B 对 A 膨胀,然后 B 对膨胀结果腐蚀。

闭运算通过填充图像的凹角来实现图像滤波,结构元大小的不同将导致滤波效果的不同,不同结构元素的选择导致不同的分割。

OpenCV 中的函数 cv.morphologyEx 也可以实现图像的闭运算,但要将参数 op 设为 MORPH_CLOSE 。

函数说明:

cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]	)→ dst

参数说明:

  • src:输入图像,可以为单通道或多通道,图像深度必须为 CV_8U, CV_16U, CV_16S, CV_32F 或 CV_64F
  • dst:输出图像,大小和类型与 src 相同
  • op:形态学运算类型
    • cv.MORPH_ERODE:腐蚀
    • cv.MORPH_DILATE:膨胀
    • cv.MORPH_OPEN:开运算, 先腐蚀再膨胀
    • cv.MORPH_CLOSE:闭运算, 先膨胀再腐蚀
  • kernel:结构元(卷积核),null 时使用 3*3 矩形卷积核
  • anchor:卷积核的锚点位置,负值表示以卷积核的中心为锚点
  • iterations:应用腐蚀和膨胀的次数,可选项,默认值为 1

例程 10.4:图像的闭运算(cv.morphologyEx)

    # 10.4 图像的闭运算 (cv.morphologyEx)
    # 读取原始图像
    imgGray = cv2.imread("../images/handwriting01.png", flags=0)  # flags=0 读取为灰度图像
    mu, sigma = 0.0, 10.0
    noiseGause = np.random.normal(mu, sigma, imgGray.shape)
    imgNoisy = imgGray + noiseGause
    imgNoisy = np.uint8(cv2.normalize(imgNoisy, None, 0, 255, cv2.NORM_MINMAX))  # 归一化为 [0,255]
    ret, imgBin = cv2.threshold(imgNoisy, 125, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)  # 二值化处理

    # 图像的闭运算
    kSize = (2, 2)  # 卷积核的尺寸
    kernel = np.ones(kSize, dtype=np.uint8)  # 生成盒式卷积核
    imgClose1 = cv2.morphologyEx(imgBin, cv2.MORPH_CLOSE, kernel)

    kSize = (3, 3)  # 卷积核的尺寸
    kernel = np.ones(kSize, dtype=np.uint8)  # 生成盒式卷积核
    imgClose2 = cv2.morphologyEx(imgBin, cv2.MORPH_CLOSE, kernel)

    kSize = (5, 5)  # 卷积核的尺寸
    kernel = np.ones(kSize, dtype=np.uint8)  # 生成盒式卷积核
    imgClose3 = cv2.morphologyEx(imgBin, cv2.MORPH_CLOSE, kernel)

    plt.figure(figsize=(10, 5))
    plt.subplot(141), plt.axis('off'), plt.title("Origin")
    plt.imshow(imgNoisy, cmap='gray', vmin=0, vmax=255)
    plt.subplot(142), plt.title("Closed kSize=(2,2)"), plt.axis('off')
    plt.imshow(imgClose1, cmap='gray', vmin=0, vmax=255)
    plt.subplot(143), plt.title("Closed kSize=(3,3)"), plt.axis('off')
    plt.imshow(imgClose2, cmap='gray', vmin=0, vmax=255)
    plt.subplot(144), plt.title("Closed kSize=(5,5)"), plt.axis('off')
    plt.imshow(imgClose3, cmap='gray', vmin=0, vmax=255)
    plt.tight_layout()
    plt.show()

在这里插入图片描述



(本节完)


版权声明:

youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/123286023)

Copyright 2022 youcans, XUPT
Crated:2022-3-5


举报

相关推荐

0 条评论