【OpenCV】(八)------ 腐蚀和膨胀
腐蚀(Erosion)和膨胀(Dilation)是形态学图像处理中的两种基本操作,常用于二值图像和灰度图像的处理。这两种操作可以改变图像中对象的形状和大小,通常用于去除噪声、填充空洞、分离或连接对象等。
腐蚀操作会减小图像中前景对象的大小。具体来说,腐蚀会将图像中的每个像素与其邻域内的所有像素进行比较,只有当邻域内的所有像素都属于前景对象时,该像素才保留为前景对象。否则,该像素会被设置为背景。腐蚀可以用于消除图像中的毛刺等细小噪声。
膨胀操作会增大图像中前景对象的大小。具体来说,膨胀会将图像中的每个像素与其邻域内的所有像素进行比较,只要邻域内有一个像素属于前景对象,该像素就会被设置为前景对象。膨胀操作相当于突出主体内容(加粗)
在 OpenCV 中,腐蚀和膨胀分别由 cv2.erode
和 cv2.dilate
函数实现。
cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
参数说明
src
: 输入图像。kernel
: 结构元素(通常是矩形或椭圆形),用于定义邻域的形状和大小。dst
: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。anchor
: 结构元素的锚点位置,默认为(-1, -1)
,表示锚点位于结构元素的中心。iterations
: 迭代次数,默认为 1。增加迭代次数会增强腐蚀或膨胀的效果。- borderType: 边界填充方式,默认为cv2.BORDER_CONSTANT。常见的边界填充方式有:
cv2.BORDER_CONSTANT
: 用常数值填充边界。cv2.BORDER_REFLECT
: 用镜像反射的方式填充边界。cv2.BORDER_REPLICATE
: 用边界像素值重复填充边界。cv2.BORDER_WRAP
: 用环绕方式填充边界。
borderValue
: 边界填充的值,默认为 0。
【示例】使用的示例图片如下:
py
# 可以选择不同的核大小核迭代次数来控制效果
kernel = np.ones((3,3))
erosion = cv2.erode(img,kernel,iterations= 2)
cv_show("erosion",erosion)
py
# 先进行腐蚀去除毛刺,再使用膨胀突出主体
kernel = np.ones((3,3))
dilate = cv2.dilate(erosion,kernel,iterations=1)
cv_show("dilate",dilate)
开运算与闭运算
开运算(Opening)和闭运算(Closing)分别基于腐蚀(Erosion)和膨胀(Dilation)操作组合而成。开运算和闭运算在处理二值图像和灰度图像时非常有用,可以用于去除噪声、填充空洞、平滑对象边界等。
开运算是先腐蚀后膨胀的操作。开运算的主要作用是:
- 去除小的前景对象:可以去除图像中的小噪声点。
- 平滑对象边界:使对象的边界更加平滑,去除细小的凸起。
闭运算是先膨胀后腐蚀的操作。闭运算的主要作用是:
- 填充小的背景区域:可以填充图像中的小孔洞。
- 平滑对象边界:使对象的边界更加平滑,去除细小的凹陷。
在 OpenCV 中,开运算和闭运算分别由 cv2.morphologyEx
函数实现,通过设置不同的参数来选择相应的操作。
py
# 开运算:先腐蚀,再膨胀
img = cv2.imread('dige.jpg')
kernel = np.ones((5,5))
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
cv_show("opening",opening)
py
# 闭运算:先膨胀,再腐蚀
img = cv2.imread('dige.jpg')
kernel = np.ones((5,5))
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
cv_show("closing",closing)
顶帽和黑帽
"黑帽"(Black Hat)和"顶帽"(Top Hat)是两种基于开运算和闭运算的高级操作。这些操作可以用于增强图像中的特定特征,如去除背景中的均匀区域或突出小的前景对象。
黑帽操作是先进行闭运算,然后从原图像中减去闭运算的结果。
顶帽操作是先进行开运算,然后从原图像中减去开运算的结果。
在 OpenCV 中,黑帽和顶帽操作分别由 cv2.morphologyEx
函数实现,通过设置不同的参数来选择相应的操作。
cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst
参数说明
src
: 输入图像。op
: 操作类型,可以是cv2.MORPH_BLACKHAT
(黑帽)或cv2.MORPH_TOPHAT
(顶帽)。kernel
: 结构元素,用于定义邻域的形状和大小。dst
: 输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。anchor
: 结构元素的锚点位置,默认为(-1, -1)
,表示锚点位于结构元素的中心。iterations
: 迭代次数,默认为 1。增加迭代次数会增强黑帽或顶帽的效果。- borderType: 边界填充方式,默认为cv2.BORDER_CONSTANT。常见的边界填充方式有:
cv2.BORDER_CONSTANT
: 用常数值填充边界。cv2.BORDER_REFLECT
: 用镜像反射的方式填充边界。cv2.BORDER_REPLICATE
: 用边界像素值重复填充边界。cv2.BORDER_WRAP
: 用环绕方式填充边界。
borderValue
: 边界填充的值,默认为 0。
py
# 礼帽:原始输入-开运算结果
img = cv2.imread('dige.jpg')
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
cv_show("tophat",tophat)
py
# 黑帽:闭运算结果-原始输入
img = cv2.imread('dige.jpg')
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
cv_show("blackhat",blackhat)