python-opencv Tutorials 一码人翻译(29)图像处理---- --分水岭

目标

在这一章,

我们将学习使用分水岭算法来使用基于标记的图像分割

我们将会看到:cv.watershed()

理论

任何灰度图像都可以被看作是一个地形面,高强度表示山峰和山丘,而低强度则表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水的上升,取决于附近的山峰(梯度),来自不同山谷的水,显然有不同的颜色会开始融合。为了避免这种情况,你在水合并的地方设置障碍。你继续工作,填满水,筑起屏障,直到所有的山峰都在水下。然后你创建的障碍会给你一个分割结果。这就是分水岭背后的“哲学”。您可以在一些动画的帮助下访问分水岭的CMM页面来理解它。

但是这种方法会给你由于噪音或图像中任何其他不规则的结果而导致的过度分割的结果。所以OpenCV实现了一个基于标记的分水岭算法,你可以在其中指定哪些是所有的谷点被合并,哪些不是。这是一个交互式图像分割。我们要做的是给我们的对象提供不同的标签。把我们确定为前景或物体的区域标记为一种颜色(或强度),将我们确定为背景或非物体的区域标记为另一种颜色,最后是我们不确定的区域,用0标记它。这是我们的标志。然后应用分水岭算法。然后我们的标记将会被我们给出的标签更新,对象的边界值为-1。

代码

下面我们将看到一个关于如何使用距离变换和分水岭来分割相互接触的物体的例子。

考虑下面的硬币图像,硬币是相互接触的。即使你对它进行了阈值,它也会相互接触。

现在我们需要清除图像中任何细小的白色噪声。为此我们可以使用形态学的开口。为了清除物体上的任何小洞,我们可以使用形态学闭合。所以,现在我们可以确定,靠近物体中心的区域是前景和区域远离物体的背景。只有我们不确定的区域是硬币的边界区域。

所以我们需要提取出我们确信它们是硬币的区域。侵蚀消除了边界像素。所以不管剩下什么,我们都可以确定它是硬币。如果物体没有相互接触,那就会起作用。但是由于它们相互接触,另一个好的选择是找到距离转换并应用一个适当的阈值。接下来,我们需要找到我们确信它们不是硬币的区域。为此,我们扩大了结果。膨胀增加了物体的边界到背景。通过这种方式,我们可以确保背景中的任何区域都是真正的背景,因为边界区域被移除。见下面的图片。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('water_coins.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)


# noise removal
kernel = np.ones((3,3),np.uint8)
opening = cv.morphologyEx(thresh,cv.MORPH_OPEN,kernel, iterations = 2)

# sure background area
sure_bg = cv.dilate(opening,kernel,iterations=3)

# Finding sure foreground area
dist_transform = cv.distanceTransform(opening,cv.DIST_L2,5)
ret, sure_fg = cv.threshold(dist_transform,0.7*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv.subtract(sure_bg,sure_fg)

# Marker labelling
ret, markers = cv.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers+1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0

markers = cv.watershed(img,markers)
img[markers == -1] = [255,0,0]

cv.imshow('dst',img)
cv.waitKey(0)
cv.destroyAllWindows()

 

猜你喜欢

转载自blog.csdn.net/qq_41905045/article/details/81708626