OpenCV腐蚀函数详解及使用方法:cv2.erode()

§ erode()

void cv::erode ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = 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 像素外推法,,参考 BorderTypes
borderValue 常量边框情况下的边框值

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)  # 保存图像文件

物联沃分享整理
物联沃-IOTWORD物联网 » OpenCV腐蚀函数详解及使用方法:cv2.erode()

发表评论