§erode()

void cv::erode(InputArraysrc,
OutputArraydst,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar&borderValue=morphologyDefaultBorderValue()
)
Python:
dst=cv.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])

通过使用特定的结构元素来腐蚀图像。

该函数使用指定的结构元素侵蚀源图像,该元素确定取最小值的像素邻域的形状:

该函数支持就地模式。侵蚀可以应用几次(迭代)。对于多通道图像,每个通道都是独立处理的。

参数

src输入图像; 通道数可以是任意的,图像类型应该是以下几种类型中的其中之一:CV_8U, CV_16U, CV_16S, CV_32F or CV_64F。
dst输出图像,与 SRC 大小和类型相同。
kernel用于腐蚀的结构元件;如果 element=Mat(),则使用 3 x 3 矩形结构元素。内核可以使用getStructuringElement函数获得。
anchor锚点在元素中的位置;默认值 (-1, -1) 表示定位点位于元素中心。
iterations施加腐蚀的次数。
borderType像素外推法,,参考BorderTypes
borderValue常量边框情况下的边框值

See also

dilate,morphologyEx,getStructuringElement

Examples:

morphology2.cpp,Morphology_1.cpp, andsegment_objects.cpp.

以上图标来自opencv的官方文档。


下面重点说一下结构元素的获取,官方文档推荐用cv2.getStructuringElement函数来获得,该函数共可生成三种类型的结构元素:

cv.MORPH_RECT矩形,腐蚀后的图像细节为矩形

cv.MORPH_CROSS十字交叉型,腐蚀后的图像细节会呈现十字型

cv.MORPH_ELLIPSE椭圆形,腐蚀后的图像细节会呈现椭圆形

除了上面三种类型的结构元素,也可以自己设定结构元素,例如:

kernel=(1,1,1,1)是一个4*1列向量,腐蚀后图像细节会呈现竖条状

kernel=np.array([[1, 1, 1, 1]], dtype=np.uint8)) ,两个[][]的是1*4的行向量,腐蚀后图像细节会呈现横条状

注意:cv2.erode()函数默认白色为前景目标,黑色为背景,所有腐蚀操作对象都是对白色部分操作的,即腐蚀会使白色目标区域变小。上面实例中,白色为较多点,黑色部分是裂缝区域,腐蚀的对象为白色背景区域,所以会减小白色区域,增大了黑色区域。

代码:

import numpy as npimport cv2 as cvimage = cv.imread('gkbuhxb5pe.jpg')# 读取图片,默认为彩色图片imgGray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)# 转换为灰度图像imgGaussBlur = cv.GaussianBlur(imgGray, ksize=(3, 3), sigmaX=2)# sigmaX:x 轴方向的高斯核标准差binaryGaussian = cv.adaptiveThreshold(imgGaussBlur, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 7, 6)# 局部自适应阈值二值化kernel_RECT = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))# 生成腐蚀结构元素print('kenerl_RECT=')print(kernel_RECT)kernel_CROSS = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5))# 生成腐蚀结构元素print('kenerl_CROSS=')print(kernel_CROSS)kernel_ELLIPS = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))# 生成腐蚀结构元素print('kenerl_ELLIPS=')print(kernel_ELLIPS)binary_Erode1 = cv.erode(binaryGaussian, kernel=kernel_RECT)# 腐蚀操,二值图像binary_Erode2 = cv.erode(binaryGaussian, kernel=kernel_CROSS)# 腐蚀操,二值图像binary_Erode3 = cv.erode(binaryGaussian, kernel=kernel_ELLIPS)# 腐蚀操,二值图像binary_Erode4 = cv.erode(binaryGaussian, kernel=(1, 1, 1, 1))# 腐蚀操,二值图像,kernel=(1,1,1,1)默认为一个4*1列向量binary_Erode5 = cv.erode(binaryGaussian, kernel=np.array([[1, 1, 1, 1]], dtype=np.uint8))# 腐蚀操,二值图像,两个[][]的是1*4的行向量cv.namedWindow('image', 0)# 设置窗口大小cv.imshow('image', image)# 显示图片cv.waitKey(0)cv.namedWindow('binary_Erode1', 0)# 设置窗口大小cv.imshow('binary_Erode1', binary_Erode1)# 显示图片cv.waitKey(0)cv.namedWindow('binary_Erode2', 0)# 设置窗口大小cv.imshow('binary_Erode2', binary_Erode2)# 显示图片cv.waitKey(0)cv.namedWindow('binary_Erode3', 0)# 设置窗口大小cv.imshow('binary_Erode3', binary_Erode3)# 显示图片cv.waitKey(0)cv.namedWindow('binary_Erode4', 0)# 设置窗口大小cv.imshow('binary_Erode4', binary_Erode4)# 显示图片cv.waitKey(0)cv.namedWindow('binary_Erode5', 0)# 设置窗口大小cv.imshow('binary_Erode5', binary_Erode5)# 显示图片cv.waitKey(0)cv.imwrite('D:/binary_Erode1.jpg', binary_Erode1)# 保存图像文件cv.imwrite('D:/binary_Erode2.jpg', binary_Erode2)# 保存图像文件cv.imwrite('D:/binary_Erode3.jpg', binary_Erode3)# 保存图像文件cv.imwrite('D:/binary_Erode4.jpg', binary_Erode4)# 保存图像文件cv.imwrite('D:/binary_Erode5.jpg', binary_Erode5)# 保存图像文件