§ erode()
void cv::erode(InputArraysrc,OutputArraydst,InputArraykernel,Pointanchor =
Point(-1,-1)
,int iterations =
1
,int borderType =
BORDER_CONSTANT
,const Scalar & 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像素外推法,,参考 BorderTypesborderValue常量边框情况下的边框值
See also
dilate, morphologyEx, getStructuringElement
Examples:
morphology2.cpp, Morphology_1.cpp, and segment_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 np
import cv2 as cv
image = 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) # 保存图像文件
版权归原作者 syluxhch 所有, 如有侵权,请联系我们删除。