形态学转换
形态学操作
侵蚀(Erosion):
功能:通过结构元素在图像上的滑动来缩小或腐蚀目标物体的边界。
函数:cv.erode()。
cv.erode():
cv.erode(src, kernel, iterations=None, anchor=None, borderType=None, borderValue=None)
- src: 输入图像,可以是灰度图像或彩色图像。
- kernel: 结构元素,用于指定形态学操作的大小和形状。
- iterations: 可选参数,表示侵蚀操作的迭代次数,默认为1。
- anchor: 可选参数,表示结构元素的锚点位置,默认为(-1,-1),即结构元素的中心点。
- borderType: 可选参数,表示边界扩充的类型,默认为cv.BORDER_CONSTANT。
- borderValue: 可选参数,表示边界值颜色,默认为0。
膨胀(Dilation):
功能:通过结构元素在图像上的滑动来扩大或扩张目标物体的边界。
函数:cv.dilate()。
cv.dilate():
cv.dilate(src, kernel, iterations=None, anchor=None, borderType=None, borderValue=None)
参数说明同cv.erode()函数,只是实现的操作不同。
开运算(Opening):
功能:先进行侵蚀操作,再进行膨胀操作,用于除去小型噪点(白色)并保持目标的整体形状。
函数:cv.morphologyEx(),使用参数cv.MORPH_OPEN。
cv.morphologyEx():
cv.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
- src: 输入图像,可以是灰度图像或彩色图像。
- op: 形态学操作类型,可以是
cv.MORPH_ERODE、cv.MORPH_DILATE、cv.MORPH_OPEN、cv.MORPH_CLOSE等。 - kernel: 结构元素,用于指定形态学操作的大小和形状。
- dst: 可选参数,输出图像,与输入图像具有相同的尺寸和类型。
- anchor: 可选参数,表示结构元素的锚点位置,默认为(-1,-1),即结构元素的中心点。
- iterations: 可选参数,表示形态学操作的迭代次数,默认为1。
- borderType: 可选参数,表示边界扩充的类型,默认为cv.BORDER_CONSTANT。
- borderValue: 可选参数,表示边界值颜色,默认为0
kernel = np.ones((5, 5), np.uint8)
erosion = cv.morphologyEx(img, cv.MORPH_OPEN, kernel, iterations=1)
闭运算(Closing):
功能:先进行膨胀操作,再进行侵蚀操作,用于填充目标内的小孔洞(黑色)并保持目标的整体形状。
函数:cv.morphologyEx(),使用参数cv.MORPH_CLOSE。
erosion = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel, iterations=1)
梯度运算(Gradient operation):
功能:通过计算图像的膨胀和侵蚀之间的差异,突出目标物体的边缘。
函数:cv.morphologyEx(),使用参数cv.MORPH_GRADIENT。
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
顶帽运算(Top Hat operation):
功能:通过原始图像与开运算之间的差异,突出原始图像中的亮区域。
函数:cv.morphologyEx(),使用参数cv.MORPH_TOPHAT。
gradient = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
黑帽运算(Black Hat operation):
功能:通过闭运算与原始图像之间的差异,突出原始图像中的暗区域。
函数:cv.morphologyEx(),使用参数cv.MORPH_BLACKHAT。
tophat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
结构元素
构造结构元素
结构元素通常使用二值矩阵表示,其中非零元素表示结构元素的有效区域。常见的结构元素形状包括矩形、圆形和十字形等。选择适当的结构元素形状和大小对于实现特定的形态学操作非常重要。
在OpenCV中,可以使用cv.getStructuringElement()函数创建指定形状和尺寸的结构元素。该函数的参数包括结构元素形状(如矩形cv.MORPH_RECT、椭圆形cv.MORPH_ELLIPSE和十字形cv.MORPH_CROSS)和结构元素尺寸。
例子:
# 矩形内核
>>> cv.getStructuringElement(cv.MORPH_RECT,(5,5))
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)
结构元素的选择
-
形状:根据图像中目标物体的形状,选择合适的结构元素形状。常见的形状包括矩形、圆形和十字形。例如,如果目标物体的边界是平滑的,则可以选择圆形结构元素;如果目标物体的边界是直线段,则可以选择矩形或十字形结构元素。
-
大小:结构元素的大小应该适合目标物体的尺度。如果目标物体比较大,可以选择较大的结构元素;如果目标物体比较小,可以选择较小的结构元素。过大的结构元素可能会模糊细节,而过小的结构元素可能会丢失重要信息。
-
方向性:某些形态学操作(如开运算和闭运算)对结构元素的方向敏感。在这种情况下,可以选择具有方向性的结构元素,以便更好地捕捉边缘或填充空隙。例如,对于水平边缘,可以选择水平方向的结构元素。
-
试错法:在选择结构元素时,可以尝试不同形状和大小的结构元素,观察形态学操作的效果,并选择最佳的结构元素。可以从小范围开始,逐渐扩大或缩小结构元素的大小,直到达到预期的效果。
需要注意的是,选择结构元素是一项艺术性的任务,取决于特定图像和形态学操作的要求。没有一种通用的方法可以适用于所有情况,因此实践和经验对于选择合适的结构元素至关重要。
此外,还可以借助图像预处理和分析的结果来辅助选择结构元素。例如,在边缘检测任务中,可以通过提取图像梯度信息来确定适当的结构元素大小和方向。