形态学分析

在 OpenCV 中,形态学(Morphology)是一种图像处理技术,主要用于处理图像中的形状和结构。形态学操作基于图像形状的形态学特征,如点、线、曲线等,而不是像素值。形态学操作通常用于图像预处理、分割、边缘检测等任务,特别是在处理二值图像(如边缘检测后的图像)时特别有效。
OpenCV 中常见的形态学操作主要包括腐蚀、膨胀、开闭操作、形态学梯度、黑帽与顶帽、击中与不击中等。
morphologyEx 是OpenCV中用于执行各种形态学操作的函数之一,函数原型为:

void morphologyEx(
InputArray src,    //输入图像,可以是任何单通道图像,通常是CV_8U类型的
OutputArray dst,   // 输出图像,与输入图像类型一致。
int op,            //形态学操作类型,这里应选择 MORPH_OPEN
InputArray kernel,   //结构元素(或内核),确定操作的性质。可以使用 getStructuringElement() 函数创建不同形状和大小的结构元素。
Point anchor = Point(-1,-1),   //结构元素的锚点位置,默认为结构元素的中心点。
int iterations = 1,    //操作的迭代次数,默认为1。
int borderType = BORDER_CONSTANT,   //边界填充的方式,默认为 BORDER_CONSTANT。
const Scalar& borderValue = morphologyDefaultBorderValue()  //边界填充的值,默认为 morphologyDefaultBorderValue()。
);


op: 形态学操作类型,可以是以下之一:

  • cv::MORPH_ERODE = 0:腐蚀操作
  • cv::MORPH_DILATE = 1:膨胀操作
  • cv::MORPH_OPEN = 2:开操作(先腐蚀后膨胀)
  • cv::MORPH_CLOSE = 3:闭操作(先膨胀后腐蚀)
  • cv::MORPH_GRADIENT = 4:表示梯度操作(基本梯度)
  • cv::MORPH_TOPHAT = 5:表示顶帽操作
  • cv::MORPH_BLACKHAT = 6:表示黑帽操作
  • cv::MORPH_HITMISS = 7:表示击中/击不中操作

腐蚀与膨胀

腐蚀

腐蚀的作用

  • 物体缩小:腐蚀操作会使图像中的物体区域缩小。在二值图像中,腐蚀会使白色区域收缩,并尽可能减少物体边缘的尖锐部分。
  • 分离连接的物体:可以分离非常接近的物体,使它们之间的连接部分变窄或完全消失,从而将它们分开成两个独立的物体。
  • 去除小的物体:可以去除图像中小的物体或细小的物体结构,这些小物体可能是噪声或者不需要的细节。
  • 平滑物体边缘:可以减少物体边缘的不规则性和毛刺,使得物体的轮廓更加平滑和自然。

函数原型:

void erode(
InputArray src,   //输入图像,可以是任何单通道图像,通常是CV_8U类型的。
OutputArray dst,   //输出图像,与输入图像类型一致。
InputArray kernel,   //结构元素(或内核),确定操作的性质。可以使用 getStructuringElement() 函数创建不同形状和大小的结构元素。
Point anchor = Point(-1,-1),   //结构元素的锚点位置,默认为结构元素的中心点。
int iterations = 1,   //腐蚀操作的迭代次数,默认为1
int borderType = BORDER_CONSTANT,   //边界填充的方式,默认为 BORDER_CONSTANT。
const Scalar& borderValue = morphologyDefaultBorderValue()  //边界填充的值,默认为 morphologyDefaultBorderValue()。
);

膨胀

膨胀的作用:

  • 物体增大:膨胀操作可以使图像中的物体区域增大。在二值图像中,膨胀会使白色区域扩展,并尽可能填充物体周围的空白区域。
  • 连接物体:可以连接两个非常接近的物体,使它们合并为一个单一的物体。这对于图像中存在断开的物体或者物体之间有缝隙的情况特别有用。
  • 填充物体的空洞:可以填充物体内部的小空洞或孔洞,使得物体看起来更加完整和连续。
  • 边缘增强:可以增强物体的边缘,使得物体边界更加清晰和明显。

函数原型

void dilate(
 InputArray src,  //输入图像,可以是任何单通道图像,通常是CV_8U类型的
 OutputArray dst,   //输出图像,与输入图像类型一致。
 InputArray kernel,   //结构元素(或内核),确定操作的性质。可以使用 getStructuringElement() 函数创建不同形状和大小的结构元素。
 Point anchor = Point(-1,-1),   //结构元素的锚点位置,默认为结构元素的中心点。
 int iterations = 1,   //膨胀操作的迭代次数,默认为1。
 int borderType = BORDER_CONSTANT,   //边界填充的方式,默认为 BORDER_CONSTANT。
 const Scalar& borderValue = morphologyDefaultBorderValue()  //边界填充的值,默认为 morphologyDefaultBorderValue()。
);

开、闭操作

基于服饰与膨胀有两个组合操作,分别为开操作和闭操作。
开操作通常用于去除小物体和噪声,平滑边缘以及分离物体之间的连接部分。
闭操作通常用于填充孔洞,连接相邻的物体,平滑物体的轮廓以及去除物体内部的小黑洞。

开操作

开操作的定义是先腐蚀后膨胀,即:开操作 = 腐蚀 + 膨胀

闭操作

闭操作与开操作类似,即 :闭操作 = 膨胀 + 腐蚀

形态学梯度

形态学梯度也是基于腐蚀和膨胀操作的输出结果再做适当的组合得到的。
形态学梯度不仅可以快速得到二值图像中各个对象的轮廓】提取对象的边缘,还能在对灰度实现形态学梯度操作之后再进行二值化。常见的三种形态学梯度分别为:基本梯度、内梯度和外梯度

基本梯度

基本梯度是对原图分别执行膨胀操作和腐蚀操作,然后将二者的输出结果相减得到基本梯度
基本梯度 = 膨胀 ( s r c ) − 腐蚀 ( s r c ) 基本梯度 = 膨胀(src) - 腐蚀(src) 基本梯度=膨胀(src)腐蚀(src)

内梯度

内梯度 = 膨胀 ( s r c ) − 原图 ( s r c ) 内梯度 = 膨胀(src) - 原图(src) 内梯度=膨胀(src)原图(src)

外梯度

外梯度 = 原图 ( s r c ) − 腐蚀 ( s r c ) 外梯度 = 原图(src) - 腐蚀(src) 外梯度=原图(src)腐蚀(src)

代码示例

使用3 * 3大小的矩阵结构元素,对输入图像完成形态学腐蚀膨胀操作,然后分别求基本梯度、内梯度和外梯度

Mat se = getStructuringElement(MORPH_RECT, Size(3,3),Point(-1,-1));
Mat basic_grad ,ex_grad, in_grad;
Mat di, er;
dilate(image,di,se);
erode(image,er,se);

//基本梯度
morphologyEx(image,basic_grad,MORPH_GRADIENT,se);

//外梯度
substruct(di,image,ex_grad);

//内梯度
substruct(image,er,in_grade);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值