【深度之眼opencv-4】:形态学操作(腐蚀、膨胀、开/闭运算、顶/黑帽)

概要

形态学,是图像处理中应用最为广泛的技术之一,主要用于从图像中提取 对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。

结构元素:
设有两幅图像B,X。 若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。 结构元素通常都是一些比较小的图像。

信息补充:

# kernel = np.ones((5,5),np.uint8)
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7,7))
# kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7,7))

print(kernel)

一、腐蚀和膨胀

图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,其中膨胀类似于“领域扩张”,将图像中的白色部分进行扩张,其运行结果图比原图的白色区域更大; 腐蚀类似于“领域 被蚕食”,将图像中白色部分进行缩减细化,其运行结果图比原 图的白色区域更小。

1、腐蚀-cv2.erode(src,element,anchor,iterations)

腐蚀的运算符是“-”。
该公式表示图像A用卷积模板B来进行腐蚀处理, 通过模板B与图像A进行卷积计算,得出B覆盖区域的像素点最小值,并用这个最小值来替代参考点的像素值。

把结构元素B平移a后得到Ba,若Ba包含于X,我们 记下这个a点,所有满足上述条件的a点组成的集合 称做X被B腐蚀(Erosion)的结果。如右图所示。
其中X是被处理的对象,B是结构元素。对于任意一 个在阴影部分的点a,Ba 包含于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之 内,且比X小,就象X被剥掉了一层似的。

  • 函数:cv2.erode(src,element,anchor,iterations)
  • 参数
    参数1:src,原图像
    参数2:element,腐蚀操作的内核,默认为一个简单的 3x3 矩阵
    参数3:anchor,默认为Point(-1,-1),内核中心点
    参数4:iterations,腐蚀次数,默认值1
    kernel = np.ones((3, 3), np.uint8)
    # kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))

    erosion = cv2.erode(img, kernel, iterations=1)

2、膨胀-cv2.dilate(img, kernel, iterations=1)

膨胀(dilation)可以看做是腐蚀的对偶运算, 其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点 组成的集合称做X被B膨胀的结果。如右图所示。
其中X是被处理的对象,B是结构元素,对于任意一 个在阴影部分的点a,Ba击中X,所以X被B膨胀的 结果就是那个阴影部分。阴影部分包括X的所有范围,就象X膨胀了一圈似的。

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    dilation = cv2.dilate(img, kernel, iterations=1)

代码汇总

import numpy as np
import cv2
import matplotlib.pyplot as plt

# -------------------------腐蚀-------------------------
flag = 0
# flag = 1
if flag:
    img = cv2.imread('./image/morphology.png')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # kernel = np.ones((3, 3), np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
    erosion = cv2.erode(img, kernel, iterations=1)

    plt.subplot(1, 2, 1), plt.imshow(img), plt.title('ori'), plt.xticks([]), plt.yticks([])
    plt.subplot(1, 2, 2), plt.imshow(erosion), plt.title('erosion'), plt.xticks([]), plt.yticks([]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值