python-opencv之形态学操作(腐蚀和膨胀)原理详解

形态学操作作用

  1. Removing noise.
  2. Isolation of individual elements and joining disparate elements in an image.
  3. Finding of intensity bumps or holes in an image.

最基本的形态操作是侵蚀和扩张。让我们更详细地了解这些操作。

Erosion 腐蚀

原理

它会侵蚀前景物体的边界,并从图像中移除小规模的细节,但同时会减少感兴趣区域的大小。

在该操作中,对图像中任意形状的奇数大小的卷积核进行卷积,如果核下的所有像素都为1,则认为原始图像中的像素(1或0)为1,否则将其侵蚀,即使其为零。

因此,根据内核的大小,所有靠近边界的像素都将被丢弃。因此前景物体的厚度或大小减小或者图像中的白色区域减小。

该方法适用于去除小的白噪声和分离两个连通的物体。

基本上,它计算给定核区域上的局部最小值。前景物体的厚度或大小会减少换句话说,图像中的白色区域会减少。

函数原型

cv2.erode(src, kernel, dst,anchor,iterations,borderType,borderValue)
src: 输入的图像

kernel: 用于腐蚀的结构元件如果element = Mat(),则使用3 × 3的矩形结构单元。内核可以使用getStructuringElement创建。

dst: 它是与src相同大小和类型的输出图像。

anchor: 它是一个整数类型的变量,表示锚点,它的默认值point是(-1,-1),这意味着锚点位于内核中心。

borderType: 是否应用边框,指定边框类型

iterations: 应用腐蚀的迭代次数

borderValue: 如果是constant边框类型,需要指定一个值

Return Value: 返回一个图像

实例

#腐蚀操作
import cv2
import matplotlib.pyplot as plt
import numpy as np

img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
cv2.imshow("cycle",img)

kernel = np.ones((5,5),np.uint8)              #设置kenenel大小
erosion_1 = cv2.erode(img,kernel,iterations=2)
erosion_2 = cv2.erode(img,kernel,iterations=3)
erosion_3 = cv2.erode(img,kernel,iterations=4)
res = np.hstack((erosion_1,erosion_2,erosion_3)) # 参数的传入为tuple
cv2.imshow("res",res)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果显示

原图
在这里插入图片描述
结果
在这里插入图片描述

Dilation(膨胀)

原理

膨胀操作通常使用一种构造元素来探测和扩展输入图像中包含的形状。这种作用与侵蚀相反
在此操作中,对图像中任意形状的奇数大小的卷积核进行卷积,如果核下至少有一个像素为1,则该像素元素为1。

所以它增加了图像中的白色区域或者前景物体的大小增加了。

为了去除噪声,侵蚀之后是膨胀。因为,侵蚀会去除白噪声,但也会缩小我们的物体。所以我们把它扩张。因为噪音消失了,它们不会再回来,但我们的目标面积增加了。

它在连接对象的破碎部分时也很有用。

函数原型

cv2.dilate(src, kernel, dst,anchor,iterations,borderType,borderValue)
src: 输入的图像

kernel: 用于膨胀的结构元件如果element = Mat(),则使用3 × 3的矩形结构单元。内核可以使用getStructuringElement创建。

dst: 它是与src相同大小和类型的输出图像。

anchor: 它是一个整数类型的变量,表示锚点,它的默认值point是(-1,-1),这意味着锚点位于内核中心。

borderType: 是否应用边框,指定边框类型

iterations: 应用膨胀的迭代次数

borderValue: 如果是constant边框类型,需要指定一个值

Return Value: 返回一个图像

实例

#腐蚀还原
import cv2
import matplotlib.pyplot as plt
import numpy as np

img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
cv2.imshow("cycle",img)

kernel = np.ones((5,5),np.uint8)              #设置kenenel大小
erosion = cv2.erode(img,kernel,iterations=3)  # 腐蚀去除白噪点
cv2.imshow("erosion",erosion)
dilate = cv2.dilate(erosion,kernel,iterations=3) # 膨胀还原图形
cv2.imshow("dilate",dilate)

#res = np.hstack((erosion_1,erosion_2,erosion_3)) # 参数的传入为tuple

cv2.waitKey(0)
cv2.destroyAllWindows()

结果展示

原图
在这里插入图片描述
腐蚀后
在这里插入图片描述
膨胀还原后
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38505858/article/details/126782368