本文共 2356 字,大约阅读时间需要 7 分钟。
开运算(Opening Operation)是形态学中常见的一种操作,其核心思想是“先腐蚀后膨胀”。这种操作通常用于消除小物体或细小裂缝,同时保持物体的主要面积不变。
开运算的数学表达式可以表示为:[ \text{开运算} = \text{腐蚀}(\text{膨胀}(\text{原图})) ]从图像处理的角度来看,开运算可以用来:
闭运算(Closing Operation)则是形态学中另一种重要的操作,其过程是“先膨胀后腐蚀”。这种操作通常用于填平图像中的小孔或“黑洞”。
闭运算的数学表达式为:[ \text{闭运算} = \text{膨胀}(\text{腐蚀}(\text{原图})) ]闭运算的主要作用包括:
形态学梯度(Morphological Gradient)是膨胀图与腐蚀图的差值,常用于提取图像的边缘信息。其数学表达式为:[ \text{形态学梯度} = \text{膨胀图} - \text{腐蚀图} ]这种操作可以用来突出图像中的边缘轮廓,特别是在二值图像中,形态学梯度可以很好地保留物体的轮廓边缘。
顶帽变换(Top Hat)又被称为“礼帽”变换,其运算结果为原图像与开运算结果的差值。具体来说:[ \text{顶帽} = \text{原图} - \text{开运算}(\text{原图}) ]顶帽变换的作用是突出图像中的亮斑区域,常用于背景提取,特别是在图像中存在明显背景时,顶帽变换可以帮助分离出较小的物体区域。
黑帽变换(Black Hat)则是闭运算结果与原图像的差值,数学表达式为:[ \text{黑帽} = \text{闭运算}(\text{原图}) - \text{原图} ]黑帽变换的作用是突出图像中的暗斑区域,常用于分离出较暗的物体区域。
OpenCV中的morphologyEx
函数是一个通用的形态学操作函数,其函数原型为:
void 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
: 输入图像,需为Mat类型,支持CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。dst
: 输出图像,与src
尺寸和类型一致。op
: 操作类型,可选值包括: kernel
: 形态学操作的内核,若为NULL则使用默认3x3的结构元素。anchor
: 锚点位置,默认为(-1, -1),表示中心对齐。iterations
: 迭代次数,默认为1。borderType
: 边界类型,默认为BORDER_CONSTANT。borderValue
: 常数边界值,默认调用morphologyDefaultBorderValue()获取。getStructuringElement
函数用于获取结构化元素(内核),支持以下类型:
anchor
的位置会影响操作结果,尤其在非中心对齐的情况下。iterations
越大,操作效果越明显,但也可能导致性能问题。borderType
的处理需要根据具体应用需求选择合适的边界模式。以下是一个使用morphologyEx
函数进行形态学操作的示例代码:
#includeusing namespace cv;int main() { // 读取输入图像 Mat src = imread("test_image.jpg"); if (src.empty()) { return 0; } // 初始化输出图像 Mat dst = src.clone(); // 设置形态学操作类型为开运算 int op = MORPH_OPEN; // 使用3x3的结构元素 Mat kernel = getStructuringElement(MORPH_CROSS, 3, 3); // 进行形态学操作 morphologyEx(src, dst, op, kernel, Point(-1, -1), 2, BORDER_REPLICATE); // 保存结果 imwrite("result.jpg", dst); return 0;}
以下是不同形态学操作的效果对比图:
通过以上代码和示例,可以清晰地看到不同形态学操作对图像的影响,从而更好地掌握图像处理的需求。
转载地址:http://kwgfk.baihongyu.com/