OpenCV图像腐蚀和膨胀、开操作、闭操作、形态学梯度、顶帽和黑帽

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.自定义核

这一部分我们在下一篇博文进行详细讲解

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值