【OpenCV】图像处理(二)图像形态学
最近来接触了一些与图像处理相关的领域内容,在具体的学习中涉及到了图像形态学以及图像的局部分割技术。然而由于时间关系一直没有对这些内容进行系统性的整理与记录。今天这篇博文中我们将深入探讨**图像形态学中最基本且重要的操作——膨胀与腐蚀的过程。
膨胀和腐蚀能用来做什么?
该技术可运用于消除噪声、分离独立像素块及连接邻近像素等操作。膨胀运算可填充凹陷区域;而腐蚀作用于去除细小凸起结构。其效果显著程度与所选结构元密切相关;此外该方法通常应用于识别图中明显极值区域,并计算梯度等特征参数;该技术常在进行二进制化处理后应用;另外它也可应用于灰度图操作
【膨胀】
膨胀操作是指将图像区域(记作A)与其对应的核(记作B)进行卷积运算。
其形状和大小具有多样性,在实际应用中,默认选择一个方形或圆形作为核心元素。
这种形态的选择能够有效提取图像特征。
通常情况下,默认使用一个小而实心的正方形或圆形作为核。
其作用是将图像区域与核进行卷积运算,并通过计算覆盖区域的最大像素值来确定目标像素的位置。
这一过程能够突出图像中的边缘信息并增强目标区域的表现力。
下图直观地展示了这一变换过程:
通过滑动窗口的方式遍历整个输入图像,
对于每一个位置,
计算窗口内所有像素的最大值,
并将该最大值赋值给对应位置的目标像素。
这种变换方法能够有效地增强目标区域的同时,
同时也能突出边缘信息并增强目标区域的表现力。

【腐蚀】
相较于膨胀而言,在形态学运算中腐蚀是膨胀的逆运算。腐蚀操作需通过卷积核计算图像中被该核覆盖区域的所有像素点的最小值。当给定一个结构元素B与原始图像进行卷积运算时,在参考点上将被B覆盖区域内的像素点取其最小值作为新的像素值。下图直观展示了腐蚀运算的具体实现过程:

在OpenCV中均给出了对应的处理函数cvErode()和cvDilate():
void cvErode(
IplImage* src,//源图像
IplImage* dst,//输出结果图像
IplConvKernel* B=NULL,//表示核,默认情况下,所使用的是参考点位于中心的3×3的核
int iterations=1//表示迭代的次数,默认为1
)
void cvDilate(
IplImage* src,
IplImage* dst,
IplConvKernel* B=NULL,
int iterations=1
)
代码解释
在上述函数中,我们特别关注到了一个参数IplConvKernel* B,在这种情况下,默认采用了一个以中心点为中心的3×3大小的核结构,在OpenCV框架下,则提供了更为灵活多样的核尺寸选择功能。
IplConvKernel* cvCreateStructuringElementEx(
int cols,
int rows,//行列表示所构造的矩形大小
int anchor_x,
int anchor_y,//核的封闭矩形内参考点的横纵坐标(x,y)
int shape,//参见下表的取值
int values=NULL
)
//释放
void cvReleaseStructuringElement(IplConvKernel** element)
代码解释
shape的取值如下:

其实在处理二值图像及其掩码时(通常在处理布尔图像及其掩码时),腐蚀与膨胀运算通常足够(其中腐蚀与膨胀运算通常足够)。然而,在处理灰度或彩色图像时(然而,在处理灰度或彩色图像时),往往会出现一些特殊情况(往往会出现一些特殊情况),这时可能需要更为灵活的形态学运算)。因此可能需要更为灵活的形态学运算(因此可能需要更为灵活的形态学运算),而OpenCV则提供了更为一般性的形态学操作方案(而OpenCV则提供了更为一般性的形态学操作方案)。
void cvMorphologyEx(
const CvArr* src,
CvArr* dst,
CvArr* temp,//该数组和源图像同样大小
IplConvKernel* element,
int operation,//这些操作见下表
int iterations=1
)
代码解释
operation类型如下:

关于其中的 opening 和 closing 等等操作, 如果对相关图像处理技术感兴趣, 可以查阅这些操作所造成的效果.
