§erode()
void cv::erode | ( | InputArray | src, |
OutputArray | dst, | ||
InputArray | kernel, | ||
Point | anchor=Point(-1,-1) , | ||
int | iterations=1 , | ||
int | borderType=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)# 保存图像文件