📜  在Python中使用形态学操作进行图像分割

📅  最后修改于: 2022-05-13 01:55:11.808000             🧑  作者: Mango

在Python中使用形态学操作进行图像分割

如果我们想从图像的其余部分中提取或定义某些东西,例如。从背景中检测物体,我们可以将图像分解成可以进行更多处理的片段。这通常称为分段

形态学操作是基于图像形状的一些简单操作。它通常在二进制图像上执行。两个基本的形态运算符是侵蚀和膨胀。有关 Dilation 和 Erosion 的基本了解,请参阅本文。

为了进行处理,我们将使用 OTSU 的阈值算法,该算法会消除由于图像中的噪声或任何其他不规则性导致的过度分割结果,并使用 OpenCV 实现。

方法 :

  • 用一种颜色(或强度)标记我们确定为前景或对象的区域,用另一种颜色标记我们确定为背景或非对象的区域。
  • 最后,我们不确定的区域,用 0 标记。这是我们的标记。然后应用分水岭算法。
  • 然后我们的标记将使用我们提供的标签进行更新,并且对象的边界将具有 -1 的值。

让我们从一个例子开始,考虑硬币图像。

输入图像:

# Python program to transform an image using
# threshold.
import numpy as np
import cv2
from matplotlib import pyplot as plt
  
# Image operation using thresholding
img = cv2.imread('c4.jpg')
  
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
ret, thresh = cv2.threshold(gray, 0, 255,
                            cv2.THRESH_BINARY_INV +
                            cv2.THRESH_OTSU)
cv2.imshow('image', thresh)

输出 :


此输出显示图像是通过阈值操作转换的,其中前景仍然包含一些噪声。

现在,我们需要去除图像中任何小的白噪声,即前景。为此,我们可以使用形态闭合。要移除前景对象中的任何小孔,我们可以使用形态闭合。为了获得背景,我们放大图像。膨胀增加对象边界到背景。

让我们看看代码:

# Noise removal using Morphological
# closing operation
kernel = np.ones((3, 3), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE,
                            kernel, iterations = 2)
  
# Background area using Dialation
bg = cv2.dilate(closing, kernel, iterations = 1)
  
# Finding foreground area
dist_transform = cv2.distanceTransform(closing, cv2.DIST_L2, 0)
ret, fg = cv2.threshold(dist_transform, 0.02
                        * dist_transform.max(), 255, 0)
  
cv2.imshow('image', fg)

输出 :

从输出图像中,我们可以得出结论,使用关闭操作删除了小洞,并确保结果中前景中的任何区域都是真正的前景。

参考 :
https://docs.opencv.org/3.3.1/d3/db4/tutorial_py_watershed.html