OpenCV-腐蚀与膨胀

腐蚀(erode)

原理

腐蚀是使用像素邻域内的局部极小运算来腐蚀一张图片;是对图像中的白色部分(高亮部分)而言的。设定卷积核尺寸,卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,那么中心元素就保持原来的像素值,否则就变为0。

函数原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* src 输入图像:通道数不限,depth必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F
* dst 输出图像:size与type与原始图像相同
* kernel 用于腐蚀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用 getStructuringElement 来创建结构元素
* anchor 结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中
* iterations 操作递归次数
* borderType 推断边缘类型
* borderValue 边缘值
*/
void cv::erode(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations = 1,
int borderType=BORDER_CONSTAN,
const Scalar& borderValue=morphologyDefaultBorderValue());

实例

1
2
3
4
Mat mat_base = imread("fish.png");
//getStructuringElement函数的返回值为指定形状和尺寸的结构元素(内核矩阵〉
Mat mat_dst;
erode(mat_base, mat_dst, Mat(), cv::Point(-1, -1), 3);//腐蚀

如图为腐蚀3次后的形状

]

膨胀(dilate)

原理

膨胀是使用像素邻域内的局部极大运算来膨胀一张图片;与腐蚀是相反操作,但是都是对图像中的白色部分(高亮部分)而言的。设定卷积核尺寸,卷积核沿着图像滑动,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1。

函数原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
* src 输入图像:通道数不限,depth必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F
* dst 输出图像:size与type与原始图像相同
* kernel 用于腐蚀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用 getStructuringElement 来创建结构元素
* anchor 结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中
* iterations 操作递归次数
* borderType 推断边缘类型
* borderValue 边缘值
*/
void cv::dilate(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations = 1,
int borderType=BORDER_CONSTAN,
const Scalar& borderValue=morphologyDefaultBorderValue());

实例

1
2
3
Mat mat_base = imread("fish.jpg");
Mat mat_dst;
dilate(mat_base, mat_dst, cv::Mat(), cv::Point(-1, -1), 3);//膨胀

如图为膨胀3次后的形状