OpenCV入门(八)——形态学技术

本文介绍了数学形态学的基本操作,如腐蚀、膨胀、开闭运算和形态学梯度,以及它们在角点提取和车牌识别中的实际应用。通过实例演示了如何使用OpenCV进行形态学处理,展示了形态学在去除噪声、边缘检测和区域分割中的重要作用。

目录

0x01 腐蚀膨胀操作

0x02 开闭运算操作

0x03 形态学梯度

0x04 形态学Top-Hat

0x05 用在哪?角点提取、车牌提取


数学形态学是基于集合论的图像处理方法,最早出现于生物学的形态与结构中,图像处理中的形态学操作用于图像预处理操作(去噪、形状简化)、图像增强(骨架提取、细化、凸包及物体标记)、物体背景分割物体形态量化等场景中。数学形态学利用点集的性质、积分几何集及拓扑学理论对物体像素集进行变换。

那么操作有如下:

  • 腐蚀与膨胀操作

  • 开闭运算操作及实现

  • 形态学梯度操作

  • 形态学TOP-Hat

0x01 腐蚀膨胀操作

膨胀操作时形态学的基本操作,实现了对目标像素点进行扩展的目的,其定义如下:

 形态学膨胀操作的思路:

运算前A与B分别为两个区域,B区域的黑点表示B的中心点,非B表示B相对于自己中心对称变换后的图形,运算后相当于B对称,沿着区域A的边界遍历一圈,区域B的中心扫过区域加上A本身的区域就是区域A膨胀区域B的结果,其中(B)z表示将B平移,使其中心点位于z位置。

腐蚀操作也是形态学的基本操作,实现了对目标像素点进行缩小的目的,其定义:

 腐蚀操作思路:

运算前A与B分别为两个区域,使用B对A进行腐蚀就是沿着区域A的内部边界遍历一圈,平移区域B形成的集合区。B的中心形成的轨迹即是腐蚀后Z的边界,(B)z表示的是B的平移,使其中心点位于z位置。

腐蚀与膨胀可以看作一种互逆运算,膨胀对原始区域扩大,腐蚀对原始区域缩小。在OpenCV中如何操作?erode()腐蚀,dilate()膨胀

void erode(
			InputArray src,
    		OutputArray dst,
    		InputArray kernel,
    		Point anchor=Point(-1,-1),
    		int iterations=1,
    		int borderType=BORDER_CONSTANT,
    		const Scalar& borderValue=morphologyDefaultB-orderValue()
)
    
void dilate(
			InputArray src,
    		OutputArray dst,
    		InputArray kernel,
    		Point anchor = Point(-1,-1),
    		int iterations = 1,
   			int borderType=BORDER_CONSTANT,
    		const Scalar& borderValue = morphologyDefault-BorderValue()
)

函数解释:

Erode()使用一个特定的结构化元素侵蚀一个图像,Dilate()使用图像结构化元素进行膨胀。

  • src:输入图像(二值化、灰度图像)

  • dst:输出图像(参数类型与输入图像一致)

  • kernel:表示定义的结构元素大小

  • anchor:结构元素的中心,如果默认参数(-1,-1),程序会自动将其设置为结构元素的中心。

  • iteration:迭代次数,可以选择对图像进行多次形态学运算。

  • borderType以及borderValue:可选择参数设置,针对边界设置。

那么腐蚀膨胀后的图像到底是什么样子?我们以下面这张图片做实验:

 使用腐蚀:

 使用膨胀:

 代码:

int main()
{
	cv::Mat srcImage = cv::imread("./image/CC.png");
	if (!srcImage.data)
		return 1;
	cv::Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);
	cv::Mat segDst, dilDst, eroDst;
	// 分通道二值化
	cv::inRange(srcGray, cv::Scalar(100),
		cv::Scalar(255), segDst);
	// 定义结构元素
	cv::Mat element = cv::getStructuringElement(
		cv::MORPH_ELLIPSE, cv::Size(5, 5));
	// 腐蚀膨胀操作
	cv::dilate(segDst, dilDst, element);
	cv::erode(segDst, eroDst, element);
	cv::imshow(" srcGray ", srcGray);
	cv::imshow(" segDst ", segDst);
	cv::imshow(" dilDst ", dilDst);
	cv::imshow(" eroDst ", eroDst);
	cv::waitKey();
	return 0;
}

cv::inRange:将两个阈值内的像素值设置为白色,而不在阈值内的像素值设置为黑色。

cv::getStructuringElement:可用于构造一个特定大小和形状的结构元素,用于图像形态学处理。

cv::getStructuringElement(
			int shape,		//结构元素形状
			Size ksize,		//结构元素大小
			Point anchor = Point(-1,-1)		//锚点 默认值Point(-1,-1)表示锚点位于结构元素中心
)

对于结构元素的形状:

从上往下是:方形、交错形状、椭圆形元素,内切于Rect(0, 0, esize.width, 0.esize.height)定义的矩形。

那么再往下讲叭:

膨胀操作中队输入图像进行特定结构元素操作取决于滑动窗口图像相关邻域的最大值,同时该

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

郑烯烃快去学习

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

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

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

打赏作者

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

抵扣说明:

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

余额充值