【OpenCV】OpenCV基础教程(6)—— 形态学处理

6. 形态学处理

6.1 腐蚀

图像的腐蚀操作是取每一个位置的矩形邻域内值的**最小值**作为该位置的输出灰度值。这里的邻域不再单纯是矩形结构的,也可以是椭圆形结构的、十字交叉形结构的等。与卷积核类似,它同样需要指定一个锚点。

因为取每个位置邻域内的最小值,所以腐蚀后输出图像的总体亮度的平均值比起原图会有所降低,图像中比较亮的区域的面积会变小甚至消失,而比较暗的区域的面积会增大。

假设原图像是 I \mathbf{I} I,经过腐蚀后的图像是 E \mathbf{E} E。因为对图像进行腐蚀操作后缩小了亮度区域的面积,所以针对阈值分割后前景是白色的二值图,可以通过 I − E \mathbf{I-E} IE操作来提取边界。如下图所示:

image-20211018211357213


对于图像的腐蚀操作,OpenCV提供了以下的函数:

void cv::erode(cv::InputArray src, cv::OutputArray dst, cv::InputArray kernel, cv::Point anchor = cv::Point(-1, -1), int iterations = 1, int borderType = 0, const cv::Scalar &borderValue = morphologyDefaultBorderValue())

与卷积操作类似,对于边界处的像素的邻域有可能会超出图像边界,所以需要扩充图像边界,边界扩充类型与图像平滑中提到的方式相同,其中的镜像扩充操作效果是最好的。对于函数erode经常需要调节的参数是 kernel 和 iterations,其他参数采用默认值即可,而代表结构元的参数 kernel 是 OpenCV 提供的函数:

cv::Mat cv::getStructuringElement(int shape, cv::Size ksize, cv::Point anchor = cv::Point(-1, -1))

shape = MORPH_RECT:产生矩形的结构元

shape = MORPH_ELLIPSEM:产生椭圆形的结构元

shape = MORPH_CROSS:产生十字交叉形的结构元

用法如下:

//输入图像
Mat I = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
//创建矩形结构元
Mat s = cv::getStructuringElement(cv::MORPH_RECT,Size(3,3));
//2次腐蚀操作
Mat E;
cv::erode(I, E, s, Point(-1,-1), 2);

6.2 膨胀

图像的膨胀操作是取每一个位置的矩形邻域内值的**最大值**作为该位置的输出灰度值。这里的邻域不再单纯是矩形结构的,也可以是椭圆形结构的、十字交叉形结构的等。与卷积核类似,它同样需要指定一个锚点。

因为取每个位置邻域内的最大值,所以膨胀后输出图像的总体亮度的平均值比起原图会有所提高,图像中比较亮的区域的面积会变大,而比较暗的区域的面积会减小。


对于图像的膨胀操作,OpenCV提供了以下的函数:

void cv::dilate(cv::InputArray src, cv::OutputArray dst, cv::InputArray kernel, cv::Point anchor = cv::Point(-1, -1), int iterations = 1, int borderType = 0, const cv::Scalar &borderValue = morphologyDefaultBorderValue())

与卷积操作类似,对于边界处的像素的邻域有可能会超出图像边界,所以需要扩充图像边界,边界扩充类型与图像平滑中提到的方式相同,其中的镜像扩充操作效果是最好的。对于函数dilate经常需要调节的参数是 kernel 和 iterations,其他参数采用默认值即可,而代表结构元的参数 kernel 是 OpenCV 提供的函数:

cv::Mat cv::getStructuringElement(int shape, cv::Size ksize, cv::Point anchor = cv::Point(-1, -1))

shape = MORPH_RECT:产生矩形的结构元

shape = MORPH_ELLIPSE:产生椭圆形的结构元

shape = MORPH_CROSS:产生十字交叉形的结构元

用法如下:

//输入图像
Mat I = cv::imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
//创建矩形结构元
Mat s = cv::getStructuringElement(cv::MORPH_RECT,Size(3,3));
//2次膨胀操作
Mat D;
cv::dilate(I, D, s, Point(-1,-1), 2);

6.3 开运算和闭运算

6.3.1 开运算

腐蚀膨胀的操作称为开运算

它具有消除亮度较高的细小区域、在纤细点处分离物体,对于较大物体,可以在不明显改变其面积的情况下平滑其边界等作用。

6.3.2 闭运算

膨胀腐蚀的操作称为闭运算

它具有填充白色物体内细小黑色空洞的区域、连接临近物体、同一个结构元、多次迭代处理,也可以在不明显改变其面积的情况下平滑其边界等作用。


开运算和闭运算的OpenCV实现如下:

void cv::morphologyEx(cv::InputArray src, cv::OutputArray dst, int op, cv::InputArray kernel, cv::Point anchor = cv::Point(-1, -1), int iterations = 1, int borderType = 0, const cv::Scalar &borderValue = morphologyDefaultBorderValue())

src:输入矩阵

op:形态学处理的各种运算,值设置选项如下:

​ MORPH_OPEN:开运算

​ MORPH_CLOSE:闭运算

​ MORPH_GRADIENT:形态梯度

​ MORPH_TOPHAT:顶帽运算

​ MORPH_BLACKHAT:底帽运算

kernel:结构元

anchor:结构元的锚点

iterations:迭代次数

6.4 其他形态学处理操作

6.4.1 顶帽变换

图像减去开运算结果称为顶帽变换(Top-hat)。

开运算可以消除暗背景下的较亮区域,那么如果用原图减去开运算结果就可以得到原图中灰度较亮的区域,所以又称白顶帽变换。它还有一个很重要的作用,就是校正不均匀光照。

6.4.2 底帽变换

图像减去闭运算结果称为底帽变换(Bottom-hat)。

闭运算可以删除亮度较高背景下的较暗区域,那么用原图减去闭运算结果就可以得到原图中灰度较暗的区域,所以又称黑底帽变换。

6.4.3 形态学梯度

膨胀结果减去腐蚀结果,可以得到图像中物体的边界,是一种提取目标物体边缘的算法。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quentin_HIT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值