综述:图像分割

综述

图像分割(segmentation、cut)指的是将数字图像划分成多个图像子区域的过程。

在实际场景中具有诸多重要应用

在广义的图像分割中,传统方法和深度方法对于分割有不同的定义。

  • 传统方法:对于图像进行区域划分,核心问题在于:区域间差异性、区域内相似性。本质上属于一个聚类问题

  • 深度方法:对于图像进行像素级分类,核心问题在于:逐像素分类,本质上是一个分类问题

实际上,在深度方法中,对于语义分割又有更加细分的问题定义

  • 语义分割:将前景与后景区分开来

  • 实例分割:将不同的物体分类分割

本课程会简要介绍传统的图像分割算法,更多注重于介绍语义分割问题。

图像分割的传统方法

在传统方法时代,主要是基于初等图像特征对图像的像素进行划分,本质上,是对一簇像素进行合并的过程。

主要的思路包括:

  • 阈值法:根据不同的像素值等级,划分出不同的方法。代表性方法为直方图法

  • 边缘法:根据梯度进行区域划分。

  • 区域法:以像素为起点,不断合并周围像素成为更大的区域。代表性方法: 区域生长,分水岭算法

  • 轮廓法:设定一个初始轮廓,定义函数值对其进行优化逼近物体的真实轮廓。

  • 图论法:将区域视为一个整体,不断进行切割。直到切割不动了(满足阈值)。

区域法

区域生长算法

  1. 选择一个像素作为中心点;
  2. 从种子向外扩张,将满足条件的点逐渐地加入种子集合中;
  3. 执行第二步,直到没有新的点加入集合。

分水岭算法

  1. 找到最小灰度值像素点,让threshold从最小值开始增长
  2. 增长过程中,如果邻阈像素没有被分类,则加入像素值
  3. 上述过程直到在边界相遇,从而对像素进行分区

图论法

每个像素视为一个节点,像素和像素连线视为边。

from skimage import data, segmentation, color
from skimage import graph
from matplotlib import pyplot as plt


img = data.coffee()

plt.imshow(img)

labels1 = segmentation.slic(img, compactness=30, n_segments=400,
                            start_label=1)
out1 = color.label2rgb(labels1, img, kind='avg', bg_label=0)

g = graph.rag_mean_color(img, labels1, mode='similarity')
labels2 = graph.cut_normalized(labels1, g)
out2 = color.label2rgb(labels2, img, kind='avg', bg_label=0)

fig, ax = plt.subplots(nrows=2, sharex=True, sharey=True, figsize=(6, 8))

ax[0].imshow(out1)
ax[1].imshow(out2)

for a in ax:
    a.axis('off')

plt.tight_layout()

原理

 然而,这种方式会使得较为边缘的区域被单独分割出来。(数据分布不均衡)

所以,normalized cut算法改进了优化函数,提出了一种归一化距离的方式。

深度学习的语义分割

数据集

  • coco数据集:20万张标注数据,150万个对象实例,171个类别

  • human parsing dataset: 25403张图像,包含背景共59个类别

  • cityscapes: 30类,5000张细致标注数据,20000张粗标注数据
  • kitti

评价指标

  • 执行时间

  • 占用内容

  • 准确度(ACC)

猜你喜欢

转载自blog.csdn.net/qq_54809548/article/details/130990622
今日推荐