任何灰度图像都可以视为地形图表面,其中高强度表示山峰和丘陵,而低强度表示山谷。您开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水的上升,取决于附近的峰(梯度),来自不同山谷(显然具有不同颜色)的水将开始合并。为了避免这种情况,您可以在水汇合的位置建造障碍。您将继续填充水和建造障碍物的工作,直到所有山峰都在水下。然后,您创建的障碍将为您提供细分结果。这就是分水岭背后的“哲学”。您可以访问分水岭上的CMM网页,借助一些动画来了解它。
但是,这种方法会由于噪声或图像中的任何其他不规则性而给您造成过分分割的结果。因此,OpenCV实施了基于标记的分水岭算法,您可以在其中指定要合并的所有山谷点,哪些不是。这是一个交互式图像分割。我们要做的是为我们知道的对象提供不同的标签。用一种颜色(或强度)标记我们确定为前景或对象的区域,用另一种颜色标记我们确定为背景或非对象的区域,最后标记为我们不确定的区域,将其标记为0。这就是我们的标记。然后应用分水岭算法。然后,我们的标记将使用给定的标签进行更新,并且对象的边界的值为-1。
1.将图像二值化和变为灰度图
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('coins.png')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold