图像分割的概念
图像分割是将图像分割成不同的区域或类别,并使这些区域或类别对应于不同的目标或局部目标。每个区域包含具有相似属性的像素,并且图像中的每个像素都分配给这些类别之一。一个好的图像分割通常指同一类别的像素具有相似的强度值并形成一个连通区域,而相邻的不同类别的像素具有不同的值。这样做的目的是简化成改变图像的表示形式,使其更有意义、更易于分析。
如果分割做得好,那么图像分析的所有其他阶段都将变得更简单。因此,分割的质量和可靠性决定了图像分析是否成功。但是如何将图像分割成正确的片段通常是一个非常具有挑战性的问题。
分割技术可以是非上下文的(不考虑图像中特征和组像素之间的空间关系,只考虑一些全局属性,例如颜色或灰度),也可以是上下文的(另外利用空间关系,例如对具有相似灰度的空间封闭像素分组)。在本章中,我们将讨论不同的分割技术,并使用scikit-image、python-opencv(cv2)和SimpleITK库函数演示基于Python的图像分割实现。为此,从导入本章所需的库开始,如下面的代码所示:
import numpy as npfrom skimage.transform import (hough_line, hough_line_peaks, hough_circle,hough_circle_peaks)from skimage.draw import circle_perimeterfrom skimage.feature import cannyfrom skimage.data import astronautfrom skimage.io import imread, imsavefrom skimage.color import rgb2gray, gray2rgb, label2rgbfrom skimage import img_as_floatfrom skimage.morphology import skeletonizefrom skimage import data, img_as_floatimport matplotlib.pyplot as pylabfrom matplotlib import cmfrom skimage.filters import sobel, threshold_otsufrom skimage.feature import cannyfrom skimage.segmentation import felzenszwalb, slic, quickshift, watershedfrom skimage.segmentation import mark_boundaries, find_boundaries
本节的这个例子源自scikit-image文档,它演示了如何从背景中分割目标。先使用基于边缘的分割算法,然后使用基于区域的分割算法。将源自skimage.data的硬币图像作为输入图像,在较幽暗的背景下勾勒出了硬币的轮廓。
如下代码实现了显示其灰度图像及其强度直方图:
coins = data.coins()hist = np.histogram(coins, bins=np.arange(0, 256), normed=True)fig, axes = pylab.subplots(1, 2, figsize=(20, 10))axes[0].imshow(coins, cmap