前言
形态学操作是一种基于形状的图像处理方法,广泛应用于二值图像的分析和处理,如噪声去除、物体检测、边缘提取等。本篇博客将详细介绍形态学操作的理论知识和几种常见的形态学操作,包括腐蚀、膨胀、开运算、闭运算、梯度、顶帽和黑帽操作。每种操作都会附上具体的实现代码,并展示其处理前后的效果图,最后附上完整代码以便学习使用。通过腐蚀和膨胀操作,看到如何改变图像中前景物体的形状;通过开运算和闭运算,可以去除小的噪声或填补物体内的小孔洞;梯度操作将帮助提取图像的边缘轮廓,顶帽和黑帽操作能够突出图像中的细小亮点和暗点。通过这些示例,帮助更好地理解和应用形态学操作来解决实际的图像处理问题。
1.理论基础
形态学操作(Morphological Operations)是一种基于集合论和几何学的图像处理技术,主要用于分析和处理二值图像(即黑白图像)以及灰度图像。这种方法利用图像中物体的形状特征来进行处理,能够有效地提取图像中的结构信息、去除噪声、分离物体、填补孔洞、以及识别图像中的边缘和区域。
形态学操作的基本思想是通过一个称为结构元素(Structuring Element)的小图形来扫描整个图像,并根据该结构元素的形状和图像像素的空间分布关系来修改图像中的像素值。结构元素的大小、形状和方向可以影响形态学操作的结果,因此在实际应用中需要根据具体需求来选择合适的结构元素。
操作 | OpenCV 函数 | 描述 | 特点 |
---|---|---|---|
腐蚀 (Erosion) | cv::erode() |
缩小前景物体的边界,将边界像素移除。 | 去除噪声,分离物体,边界变得锐利。 |
膨胀 (Dilation) | cv::dilate() |
扩展前景物体的边界,将背景像素转为前景。 | 填补小孔,连接邻近物体,边界平滑。 |
开运算 (Opening) | cv::morphologyEx() (MORPH_OPEN) |
先腐蚀后膨胀 | 去除小型孤立噪声,保留物体的整体形状。 |
闭运算 (Closing) | cv::morphologyEx()` (MORPH_CLOSE) | 先膨胀后腐蚀 | 填补物体内的小孔洞,保持形状完整。 |
梯度 (Gradient) | cv::morphologyEx() (MORPH_GRADIENT) |
膨胀图与腐蚀图的差计算边界 | 强调图像的边缘特征。 |
顶帽 (Top Hat) | cv::morphologyEx() (MORPH_TOPHAT) |
输入图像与开运算结果的差值 | 强调局部亮区域。 |
黑帽 (Black Hat) | cv::morphologyEx() (MORPH_BLACKHAT) |
闭运算结果与输入图像的差值 | 强调局部暗区域。 |
(1)腐蚀(Erosion)
腐蚀操作通过结构元素去缩小图像中的前景物体,将边界像素移除,从而使物体的边界收缩。这种操作通常用于去除图像中的小型噪点,分离物体,或使得物体的边界更加锐利。腐蚀的结果是物体变小,而背景区域变大。
如果 ( B ) 是结构元素,( A ) 是输入图像,则B对A的腐蚀操作可以表示为:
A ⊖ B = { z ∣ ( B ) z ⊆ A } A \ominus B = \{z \mid (B)_z \subseteq A\} A⊖B={
z∣(B)z⊆A}
上图使用腐蚀删除图像中的某些部分:(a)大小为486x486的焊线模板的二值图像,前景像素显示为白色;
(b)~(d)使用所有值为1、大小分别为 11x11、15x15 和 45x45 的结构元腐蚀图像后的结果
(2)膨胀(Dilation)
膨胀操作是腐蚀的反操作,它通过结构元素扩展图像中的前景物体,将周围的背景像素转为前景像素,使得物体的边界向外扩展。膨胀操作可用于填补物体中的小孔、连接相邻的物体,或使得物体的边界更加平滑。
如果 ( B ) 是结构元素,( A ) 是输入图像,则B对A的膨胀操作可以表示为:
A ⊕ B = { z ∣ ( B ) z ∩ A ≠ ∅ } A \oplus B = \{z \mid (B)_z \cap A \neq \emptyset\} A⊕B={
z∣(B)z∩A=∅}
膨胀示例:
上图a带有断裂字符的低分辨率文本(见放大后的视图 );(b)结构元;©(b)对(a)的膨胀。断裂已连上。
(3)开运算(Opening)
开运算是先进行腐蚀,再进行膨胀操作。用于去除小的孤立噪声点,同时保留物体的整体形状。开运算可以有效地去除散落在背景中的小物体,而不显著改变原始物体的形状。
结构元B对集合A的开运算(表示为 A ∘ B A\circ B A∘B )定义为
A ∘ B = ( A ⊖ B ) ⊕ B A \circ B = (A \ominus B) \oplus B A∘B=(A⊖B)⊕