形态学,即数学形态学,是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。
形态学运算主要包括:腐蚀、膨胀、开运算、闭运算、形态梯度运算、顶帽运算、黑帽运算等。
1. 腐蚀
侵蚀可以消除图像的边界点,使图像沿边界向内收敛,也可以去除小于指定结构元素的部分。这样就可以实现去噪、元素分割等功能。
在OpenCV 中,使用函数 cv2.erode( )实现腐蚀操作,其语法格式为:
dst = cv2 .erode ( src, kernel [, anchor [, iterations[, borderrype [,
borderValue]]]])
where:
- dst 是腐蚀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
- src 是需要进行腐蚀的原始图像,图像的通道数可以是任意的。
- •kernel 代表腐蚀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
- anchor代表element结构中锚点的位置。该值默认为(-1,-1),在核的中心位置。
- iterations 是腐蚀操作迭代的次数,该值默认为 1,即只进行一次腐蚀操作。
- borderType 代表边界样式,一般采用其默认值 BORDER_CONSTANT。
- bordervalue 是边界值,一般采用默认值。
2. 膨胀
膨胀操作和腐蚀操作的作用完全相反,膨胀操作可以扩大图像的边界。膨胀操作有助于在图像分割后填补图像中的空白。
在OpenCV 中,使用函数 cv2.dilate( )实现膨胀操作,其语法格式为:
dst = cv2.dilate ( src, kernel [, anchor [, iterations[, borderrype [,
borderValue]]]])
where:
- dst 是膨胀后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
- src 是需要进行膨胀的原始图像,图像的通道数可以是任意的。
- •kernel 代表膨胀操作时所采用的结构类型。它可以自定义生成,也可以通过函数cv2.getStructuringElement()生成。
- anchor代表element结构中锚点的位置。该值默认为(-1,-1),在核的中心位置。
- iterations 是膨胀操作迭代的次数,该值默认为 1,即只进行一次膨胀操作。
- borderType 代表边界样式,一般采用其默认值 BORDER_CONSTANT。
- bordervalue 是边界值,一般采用默认值。
3. 通用形态学函数
腐蚀操作和膨胀操作是形态学运算的基础,将腐蚀和膨胀操作进行组合,就可以实现开运算、闭运算(关运算)、形态学梯度 (Morphological Gradient) 运算、礼帽运算(顶帽运算)、黑帽运算、击中击不中等多种不同形式的运算。
OpenCV 提供了函数 cv2.morphologyEx0来实现上述形态学运算,其语法结构如下:
dst = cv2.morphologyEx ( src, op, kernel[, anchor[, iterations[, borderType[,
borderValue]]]]] )
where:
- dst代表经过形态学处理后所输出的目标图像,该图像和原始图像具有同样的类型和大小。
- src 代表需要进行形态学操作的原始图像。
- op代表操作类型,如下表所示。各种形态学运算的操作规则均是将腐蚀和膨胀操作进行组合而得到的。
- 其他参数参照上面的腐蚀扩展,含义同上。
四、开放式操作
开运算进行的操作是先对图像腐蚀,再对腐蚀后的对象进行膨胀。开运算可以用于去噪、计数等。语法格式就是在通用形态学函数的基础上,将参数op设置为cv2.MORPH_OPEN即可。
五、封闭式操作
闭合操作是先进行膨胀操作,再对膨胀后的图像进行腐蚀操作。闭合操作有利于闭合前景物体内部的小孔,或者去除物体上的小黑点,还可以连接不同的前景图像。语法格式见表3。
6.形态梯度操作
形态梯度运算是从图像的膨胀图像中减去被侵蚀的图像的操作,可以得到原始图像中前景图像的边缘。语法格式见表3。
7. 礼帽操作
顶帽运算是从原始图像中减去图像的开运算得到的图像。顶帽操作可以获得图像的噪声信息,也可以获得比原始图像边缘更亮的边缘信息。
八、黑帽操作
黑帽操作是从闭合图像中减去原始图像。黑帽操作可以获得图像内部的小洞,或者前景中的小黑点,或者获得比原始图像边缘更暗的边缘部分。
9.内核函数
在进行形态学操作时,必须使用一个特定的核(结构元)。该核可以自定义生成,也可以通过函数 cv2.getStructuringElement()构造。函数 cv2.getStructuringElement()能够构造并且返回一个用于形态学处理所使用的结构元素。该函数的语法格式为:
retval = cv2.getStructuringElement ( shape, ksize[, anchor])
该函数用于返回一个指定大小和形状的结构元素,用于形态学操作
- ksize代表结构元素的大小
- shape代表形状类型,可能的取值如下:
cv2.MORPH_RECT | 矩形结构元素,所有元素值都是1 |
---|---|
cv2.MORPH_CROSS | 十字形结构元素,对角线元素值为1 |
cv2.MORPH_ELLIPSE | 椭圆形结构元素 |
文章出处登录后可见!