1.什么是图像腐蚀和膨胀
首先来看图像的腐蚀和膨胀,图像的腐蚀和膨胀都是相较于高亮部分而言,对应的二值化图像就是对白色区域而言,膨胀通俗来讲就是对将白色部分在原来的形状上扩大,对黑色部分压缩,腐蚀和膨胀操作相反。
2.图像腐蚀和膨胀的作用
1.消除噪声
2.分割图像和连接图像
3.求局部最大值和局部最小值(对图像进行数学卷积运算)我们后面具体说明
4.求图像的梯度
3.图像腐蚀和膨胀的代码实现
膨胀函数
void dilate(
InputArray src, //输入图像
OutputArray dst, //输出图像
InputArray element, //一个未被初始化的Mat()核
Point anchor, //定义一个锚点,一般是(-1,-1)中心像素对齐
int iterations = 1, //迭代次数
int borderType = BORDER_CONSTANT, //边界类型,前面的博客中已进行讲解
const Scalar& botderValue = morphologyDefaultBorderValue()//传入的边界常数值
);
关于第三个参数自定义一个核,我们在后面会详细讲解。
迭代次数指的是这个函数重复运行的次数。
我们来看看这个函数的数学原理
B是一个3*3的算子,他从图像最左边进行遍历,这个算子一般是
(1,1,1
1,1,1
1,1,1 )
在这个3*3的核中,将像素最大值给到中心像素,如图所示,从而实现膨胀操作。
图像腐蚀函数
唯一不同的地方就是,在3*3的核中会将最小的值给中心像素,从而实现腐蚀操作。
void erode(
InputArray src, //输入图像
OutputArray dst, //输出图像
InputArray element, //定义一个未初始化的核
Point anchor = Point(-1,-1), //定义一个锚点,中心像素对齐
int iterations = 1, //迭代次数
int borderType = BORDER_CONSTANT, //边缘扩展,常数填充
const Scalar& borderValue = morphologyDefaultBorderValue()//常数
);
4.开操作和闭操作
开操作(先腐蚀后膨胀)一般用于消除细长的突出物,再还原。之所以称为开操作是因为可以将具有细微连接的物体分开,比如细胞计数过程。
闭操作(先膨胀后腐蚀)一般用于消除物体内部细小的空隙,用于物体连接,形成闭合整体。
开操作和闭操作函数
//开操作
void morphlogyEx(
InputArray src, //输入图像
OutputArray dst, //输出图像
int op = MOP_OPEN, //开操作
InputArray element, //自定义核
Point anchor = Point(-1,-1), //中心像素对齐
int iterations = 1, //迭代次数
int borderType = BORDER_CONSTANT, //边缘常数填充
const Scalar& borderValue = morphologyDefaultBorderValue()//边缘常数默认值
);
//闭操作
void morphlogyEx(
InputArray src, //输入图像
OutputArray dst, //输出图像
int op = MOP_CLOSE, //闭操作
InputArray element, //自定义核
Point anchor = Point(-1,-1), //中心像素对齐
int iterations = 1, //迭代次数
int borderType = BORDER_CONSTANT, //边缘常数填充
const Scalar& borderValue = morphologyDefaultBorderValue()//边缘常数默认值
);
5.形态学梯度
之所以称为形态学梯度是因为一般的获得边缘方式是通过sobel算子计算梯度获得,而这种获得梯度的方式是通过膨胀减腐蚀获得边缘,是通过形态学操作的方式获得边缘。
形态学梯度函数
void morphlogyEx(
InputArray src, //输入图像
OutputArray dst, //输出图像
int op = MOP_GRADIENT, //梯度操作
InputArray element, //自定义核
Point anchor = Point(-1,-1), //中心像素对齐
int iterations = 1, //迭代次数
int borderType = BORDER_CONSTANT, //边缘常数填充
const Scalar& borderValue = morphologyDefaultBorderValue()//边缘常数默认值
);
6.顶帽和黑帽
顶帽操作是用原图像减去开运算的图像
一般用于提取图象中的高亮部分,因为开操作会消除高亮部分,用原图像减去开操作后的图像就会得到高亮部分的图像
黑帽操作是用闭运算的图像减去原图像
一般用于提取低亮部分的图像,因为闭操作会消去细小的低亮部分,用低亮部分的图像减去原图像获得低亮部分的图像
7.自定义核
这一部分我们在下一篇博文进行详细讲解