简单来说,计算机视觉就是为计算机提供类似人类的视觉。作为人类,我们很容易识别任何物体。我们可以很容易地识别山丘、树木、土地、动物等,但计算机没有眼睛,也没有大脑,因此它很难识别任何图像。计算机只能理解命令和数学。因此,有很多技术可以让计算机识别各种物体。图像分割是目标检测的方法之一。
图像分割是指通过对图像的像素值进行聚类来划分输入图像。它主要用于从图像中识别各种表面或生物或非生物物体。例如,如果您有以下图像作为输入,那么您可以将老虎、绿草、蓝色的水和陆地作为输出图像中的各种表面。
有各种图像分割技术,例如活动轮廓、分割和合并、分水岭、区域分割、区域合并、基于图的分割、均值平移和模型查找以及归一化剪切。
本文介绍了一种最有用的图像分割技术,称为“主动轮廓”。
主动轮廓是一种分割方法,它使用能量力和约束将感兴趣的像素从图片中分离出来,以进行进一步的处理和分析。
活动轮廓被定义为分割过程的活动模型。轮廓是定义图像中感兴趣区域的边界。轮廓是已插值的点的集合。插值过程可能是线性、样条或多项式,具体取决于图像中曲线的描述方式。
活动轮廓在图像处理中的主要用途是定义图像中的平滑形状并构建区域的闭合轮廓。主要用于识别图像中不均匀的形状。
活动轮廓用于各种医学图像分割应用。各种形式的活动轮廓模型被用于各种医学应用中,特别是用于从各种医学图像中分离所需区域。例如,使用主动轮廓模型检查大脑 CT 扫描的切片以进行分割。
活动轮廓是一种在图像中获取具有分割约束和力的可变形模型或结构的技术。轮廓模型定义对象边界或其他图片特征以生成参数曲线或轮廓。
模型的曲率是使用多种利用外力和内力的轮廓技术来确定的。能量函数总是与图像的曲线相关。外部能量被描述为由专门用于控制轮廓在图像上的位置的图片引起的力和用于控制变形变化的内部能量的总和。
对某一图像的轮廓分割约束是根据需要确定的。通过定义能量函数可以获得所需的形状。定位轮廓的点的集合用于描述轮廓变形。该形状对应于所需的图像轮廓,其是通过最小化能量函数来定义的。
蛇模型是一种能够解决广泛的分割问题的技术。该模型的主要功能是识别和勾勒出目标对象以进行分割。它需要对目标物体的形状有一些先验知识,尤其是对于复杂的物体。主动蛇模型(通常称为蛇)通常通过使用专注于最小化能量的样条线进行配置,然后使用控制图像的各种力。
主动蛇模型的应用正在迅速扩展,特别是在许多成像领域。在医学成像领域,蛇模型用于分割图像中与图片的其他区域相比具有独特特征的部分。医学成像中的传统蛇模型应用包括用于识别青光眼的视盘和视杯分割、细胞图像分割、血管区域分割以及用于诊断和研究疾病或异常的其他几个区域分割。
传统的主动蛇模型方法存在各种低效问题,例如高复杂性对象中的噪声敏感性和错误的轮廓检测,这些问题在先进的轮廓方法中得到了解决。
梯度矢量流模型是蛇形或活动轮廓模型的更发达且定义明确的版本。传统的蛇模型有两个局限性:凹边界的轮廓收敛不充分以及蛇曲线流在距离最小值很远的地方开始。作为扩展,梯度矢量流模型利用梯度矢量流场作为能量约束来确定等高线流。
在 2D 中,GVF 矢量场 F G V F F_{GVF} FGVF最小化能量泛函
其中“μ”是可控平滑项。
气球模型中引入了作用在蛇上的力的膨胀项。
其中 g(I) 是停止函数,c是拉格朗日乘子,K 是曲率,矢量 N 是单位向内法线。这种特殊形式的曲线演化方程仅依赖于法线方向的速度。因此,通过将水平集函数 φ 插入其中,可以将其等效地重写为欧拉形式,如下所示
Python代码:
import numpy as np
import matplotlib.pyplot as plt
from skimage.color import rgb2gray
from skimage import data
from skimage.filters import gaussian
from skimage.segmentation import active_contour
image = data.astronaut()
image = rgb2gray(image)
s = np.linspace(0, 2*np.pi, 400)
r = 100 + 100*np.sin(s)
c = 220 + 100*np.cos(s)
init = np.array([r, c]).T
snake = active_contour(gaussian(image, 3, preserve_range=False),
init, alpha=0.015, beta=10, gamma=0.001)
fig, ax = plt.subplots(figsize=(7, 7))
ax.imshow(image, cmap=plt.cm.gray)
ax.plot(init[:, 1], init[:, 0], '--r', lw=3)
ax.plot(snake[:, 1], snake[:, 0], '-b', lw=3)
ax.set_xticks([]), ax.set_yticks([])
ax.axis([0, image.shape[1], image.shape[0], 0])
plt.show()`