形态学(Mathematical Morphology)是图像处理中重要的方法,专注于从图像中提取结构信息和形态特征。主要应用于二值图像,通过基本的形态学操作对图像进行变换和处理。
基本操作:
腐蚀(Erosion**):通过结构元素(核)缩小图像中亮度较高区域的边界,用于去除小物体或
者连接物体。
膨胀(Dilation**):通过结构元素扩展图像中亮度较高区域的边界,增加物体的大小或者连接
相邻物体。
组合操作:
开运算(Opening**):先进行腐蚀后再进行膨胀,用于去除小物体同时保留大物体的特征。
闭运算(Closing**):先进行膨胀后再进行腐蚀,可以填充小的空洞同时保留大的物体。
高级操作:
形态学梯度(Morphological Gradient**):膨胀图像减去腐蚀图像,用于检测图像中的边 界。
顶帽运算(Top Hat**):原始图像减去开运算的结果,用于提取图像中的小物体或细节。
黑帽运算(Black Hat**):闭运算的结果减去原始图像,用于提取图像中的大物体或背景。
应用领域:
视觉检测:边缘检测、形状分析和对象分割。
文字识别(OCR**):预处理文本图像以提高字符识别准确性。
医学图像处理:增强和分割医学图像中的细胞结构和器官轮廓等。
结构元**-**核:
在形态学操作中,结构元(kernel)是一个核心组件,决定了形态学操作的形状和大小。结构元通常是
一个小矩阵,用于在图像中扫描并执行形态学操作。
精确定义形态学操作: 结构元定义了形态学操作的形状和大小,使我们能够针对特定的图像特征进行精确的处理。
多样性和灵活性: 结构元可以有不同的形状和大小,如矩形、椭圆和十字形。
局部处理: 结构元通过局部扫描图像进行操作,这种局部处理方式能够在保持全局特征的同时,细 致地处理图像的局部细节。
核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己的结构,比如矩形结构、椭圆结构、十字形结构。
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1, -1));
参数说明:
返回值:指定大小和形状的结构元素-核。
shape:指定结构元素的形状。常用的形状类型包括:
MORPH_RECT :矩形结构元素,所有元素值均为 1。适合处理规则形状的对象。
MORPH_ELLIPSE :椭圆形结构元素,适合处理圆形或椭圆形对象。
MORPH_CROSS :十字形结构元素,适合处理线状结构。
常用的形状类型及对应的整形值
MORPH_RECT = 0 (矩形结构元)
MORPH_CROSS = 1 (十字形结构元)
MORPH_ELLIPSE = 2 (椭圆结构元)
ksize: Size 类型,表示结构元素的大小。
anchor(可选):结构元素的锚点,即参考点,表示结构元素在图像上的应用位置。
腐蚀
腐蚀操作是一种形态学操作,用于图像处理,特别是二值图像的处理。其主要作用是收缩或细化图像中的前景部分,通过去除边界点实现噪声去除和元素分割等功能。
腐蚀操作步骤:
- 将结构元的中心与图像中的一个像素对齐。
- 将结构元中值为1的区域与被覆盖的图像区域对应的像素值相乘,取这些像素值中的最小值。
- 结构元中心对应的像素点的像素值为此最小值。
- 移动结构元到下一个像素,重复上述步骤,直到处理完所有像素。
结果是二值化图像中的白色部分被压缩,使图像中的前景部分"变瘦"。
应用:
去除噪声:腐蚀操作可以消除图像中的小噪声点。
细化形状:使图像中的前景部分变瘦,突出结构细节。
元素分割:通过腐蚀操作,可以将连在一起的对象分割开。
腐蚀操作通过在二值图像上滑动结构元,并在每个位置计算最小值,来收缩前景部分。这一操作能够去除噪声、分割元和细化形状。
void erode(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1, -1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
);
参数说明
src :需要进行腐蚀操作。可以是单通道或多通道图像。
dst:腐蚀操作后的输出图像,类型与尺寸与输入图像相同。
kernel :腐蚀操作中使用的结构元(或核)。
anchor :结构元中锚点的位置。默认值为 Point(-1, -1) ,表示锚点位于结构元的中心。
iterations (可选):腐蚀操作的迭代次数,默认值为****1。
borderType*(可选)*:边界填充类型,处理图像边界时指定填充方式。默认值为
BORDER_CONSTANT 。
borderValue*(可选)*:在边界填充类型为 BORDER_CONSTANT 时,指定填充值。默认值为0。
膨胀
膨胀与腐蚀刚好相反,膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像 的边界点向外扩张。
膨胀操作:
- 将结构元的中心与图像中的一个像素对齐。
- 结构元值为1的区域与被结构元覆盖的对应区域进行相乘,取这些像素值中的最大值。
- 最大值赋值给结构元中心对应的图像像素。
- 移动结构元到下一个像素,重复上述步骤,直到处理完所有像素。
void cv::dilate ( InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar & borderValue = morphologyDefaultBorderValue()
);
dst:膨胀操作后的目标图像。输出图像与输入图像 src 类型和大小相同。
src:输入的原始图像,需要进行膨胀操作的图像。
kernel:膨胀操作时使用的结构元(或核)。
anchor(可选):锚点是结构元的中心点。
iterations(可选):膨胀操作的迭代次数,默认为 1 。-重复的次数
borderType:指定图像边界的处理方式。
borderValue(可选):当使用 cv::BORDER_CONSTANT 时,用于设置填充的常量值,默认为 0 .
OpenCV****中的形态学运算
void cv::morphologyEx(InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anchor = Point(-1, -1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue =
morphologyDefaultBorderValue()
);
src:需要进行形态学运算的原始图像。
dst :形态学运算后的输出图像,与输入图像 src 类型和大小相同。
op :指定形态学操作的类型。常见的类型包括:

kernel:用于形态学运算的结构元素,可以通过 cv.getStructuringElement 函数生成。
anchor(可选):结构元素的锚点,即参考点。默认值为 (-1, -1) ,表示锚点位于结构元素的中
心。
iterations(可选):形态学运算的迭代次数,默认值为1。
borderType(可选):像素外插法,默认为 cv.BORDER_CONSTANT 。
borderValue(可选):边界像素的填充值,默认情况下为 0。
开运算
开运算是先将图像腐蚀,再对腐蚀的结果进行膨胀。开运算可以用于去噪、计数等。
-
去除小物体和噪声
-
平滑图像边界
-
提取大物体的主要特征
-
计数
闭运算
闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,同时保
持物体的整体形状,还可以将不同的前景图像进行连接。
1**、噪声消除**
2**、孔洞填充**
3**、对象连接**
形态学梯度运算
通过对图像进行膨胀操作后减去腐蚀操作的结果,从而提取出原始图像中前景物体的边缘。
原理与步骤
- 膨胀操作(Dilation): 膨胀操作会扩展图像中前景(白色)像素的边界,使得前景区域变大。
- 腐蚀操作(Erosion): 腐蚀操作会收缩图像中前景(白色)像素的边界,使得前景区域变小。
- 边缘提取: 将膨胀操作后的图像减去腐蚀操作后的图像。
利用形态学梯度运算可以清晰地突出前景物体的轮廓,捕捉图像当中的边界信息。
礼帽运算
顶帽运算是一种形态学图像处理技术,其主要用于提取图像中的细微结构和亮斑区域,进而突出图像中的特定信息。它的基本原理是将原始图像减去其开运算(Opening)结果。
优点:
提取细微结构.
突出亮斑区域.
噪声信息提取.
黑帽运算
黑帽运算(Black-hat Transformation)是一种在形态学图像处理中常用的技术。
原理
黑帽运算:将闭运算处理后的图像减去原始图像。
应用
- 提取细小暗斑:
- 检测孔洞和缝隙:

