图像分割:Python的SLIC超像素分割

1. 什么是超像素?

在单个或多个通道中,图像表示为像素网格。我们采用这些M x N像素网格,然后对其应用算法,例如面部检测和识别,模板匹配,甚至将深度学习直接应用于原始像素强度。

像素网格并不是图像的自然表示。事实上,单个像素并不具有语义含义,将像素分组为像素网格只是图像的伪影,这是捕获和创建数字图像过程的一部分。

当在像素网格上执行像素局部分组时,我们就会得到超像素(Superpixel)。 超像素比简单的像素网格具有更多的感知和语义含义。

2. 为什么超像素在计算机视觉方面有重要的作用?

像素网格到超像素的映射 将具有以下理想的特性:

  • 计算效率:超像素使我们能够将图像本身的复杂性从数十万个像素减少到仅数百个超像素。这些超像素中的每一个都将包含某种感知性的,理想情况下是语义性的值。

  • 感知意义:相比检查几乎没有感知意义的像素网格中的单个像素,属于一个超像素组的像素具有某种共性,例如相似的颜色或纹理分布。

  • 过度分割:大多数超像素算法都会过度分割图像。在找到图像中大多数重要边界的同时,产生了一些微不足道的边界。但恰恰证明超像素分割并未损失细节。从像素网格到超像素映射的像素损失很少(或没有)。

  • 超像素上的图形:更具有“代表性有效”。相比在50,000 x 50,000像素的网格上构造一个图形,其中每个像素代表图形中的一个节点,将超像素应用于像素网格空间,用剩下200个(任意)超像素,构建图形实际上更为有效。

3. 简单线性迭代聚类(SLIC)

简单线性迭代聚类(Simple Linear Iterative Clusters SLIC),执行SLTC 超像素分割,可以用超像素段覆盖原始图像;

segments = slic(image, n_segments = numSegments, sigma = 5)

  • 仅有一个必需参数:
  • image:待执行SLTC超像素分割的图像,必须
  • n_segments: 定义我们要生成多少个超像素段的参数,默认100,可选
  • sigma:在分割之前应用的平滑高斯核,默认5,可选

4. 效果图

分割100、200、300块的效果图如下:
在这里插入图片描述
分割 50块效果图:

在这里插入图片描述
分割 100块效果图~~
在这里插入图片描述

5. 源码

#  USAGE
#  python superpixel.py --image cactus.jpg

import argparse

import matplotlib.pyplot as plt
from skimage import io
from skimage.segmentation import mark_boundaries  # 导入mark_boundaries 以绘制实际的超像素分割
# 导入必要的包
from skimage.segmentation import slic  # 导入包以使用SLIC superpixel segmentation
from skimage.util import img_as_float

# 构建命令行参数及解析
# --image 输入图片的路径
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())

# 加载图像
# 将图像从无符号的8位int转换为具有[0,1]范围的浮点数据
image = img_as_float(io.imread(args["image"]))

# 遍历超像素段的数量 研究3种尺寸不断增加的段,100、200、300
for numSegments in (30, 50, 100):
    # 执行SLTC 超像素分割,该功能仅获取原始图像并覆盖我们的超像素段。
    # 仅有一个必需参数:
    # image:待执行SLTC超像素分割的图像
    # n_segments: 定义我们要生成多少个超像素段的参数,默认100
    # sigma:在分割之前应用的平滑高斯核
    segments = slic(image, n_segments=numSegments, sigma=5)

    # 绘制SLTC 的分割结果
    fig = plt.figure("Superpixels -- %d segments" % (numSegments))
    ax = fig.add_subplot(1, 1, 1)
    ax.imshow(mark_boundaries(image, segments))
    plt.axis("off")

# 展示图像
plt.show()

参考

https://www.pyimagesearch.com/2014/07/28/a-slic-superpixel-tutorial-using-python/

猜你喜欢

转载自blog.csdn.net/qq_40985985/article/details/109813956