【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较


【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较


5.2 基于超像素的区域分割

超像素图像分割基于依赖于图像的颜色信息及空间关系信息,将图像分割为远超于目标个数、远小于像素数量的超像素块,达到尽可能保留图像中所有目标的边缘信息的目的,从而更好的辅助后续视觉任务(如目标检测、目标跟踪、语义分割等)。

超像素是由一系列位置相邻,颜色、亮度、纹理等特征相似的像素点组成的小区域,我们将其视为具有代表性的大“像素”,称为超像素。超像素技术通过像素的组合得到少量(相对于像素数量)具有感知意义的超像素区域,代替大量原始像素表达图像特征,可以极大地降低图像处理的复杂度、减小计算量。

超像素分割的结果是覆盖整个图像的子区域的集合,或从图像中提取的轮廓线的集合。 超像素的数量越少,丧失的细节特征越多,但仍然能基本保留主要区域之间的边界及图像的基本拓扑。

超像素一般不会破坏图像中物体的边界信息,经常用于图像分割算法的预处理,例如:跟踪,标签分类,视频前景分割,骨架提取、人体姿态估计、医学图像分割。

常用的超像素分割方法有:

  • 简单线性迭代聚类(Simple Linear Iterative Clustering,SLIC) 171.SLIC 超像素区域分割
  • 能量驱动采样(Super-pixels Extracted via Energy-Driven Sampling,SEEDS) 173.SEEDS 超像素区域分割
  • 线性谱聚类(Linear Spectral Clustering,LSC) 174.LSC 超像素区域分割

例程 11.32: 超像素区域分割方法比较

    # 11.32 LSC 超像素区域分割之算法比较
    # 注意:本例程需要 opencv-contrib-python 包的支持
    img = cv2.imread("../images/imgBuilding2.png", flags=1)  # 读取彩色图像(BGR)
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)  # BGR-HSV 转换

    # SLIC 算法 (Simple Linear Iterative Clustering)
    slic = cv2.ximgproc.createSuperpixelSLIC(img, region_size=20, ruler=10.0)  # 初始化 SLIC
    slic.iterate(10)  # 迭代次数,越大效果越好
    mask_slic = slic.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1
    img_slic = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_slic))  # 在原图上绘制超像素边界

    # SEEDS 算法 (Super-pixels Extracted via Energy-Driven Sampling)
    seeds = cv2.ximgproc.createSuperpixelSEEDS(img.shape[1], img.shape[0], img.shape[2], 2000, 15, 3, 5, True)
    seeds.iterate(img, 10)  # 输入图像大小必须与初始化形状相同,迭代次数为10
    mask_seeds = seeds.getLabelContourMask()  # 获取 Mask,超像素边缘 Mask==1
    label_seeds = seeds.getLabels()  # 获取超像素标签
    number_seeds = seeds.getNumberOfSuperpixels()  # 获取超像素数目
    img_seeds = cv2.bitwise_and(img, img, mask=cv2.bitwise_not(mask_seeds))

    # LSC 算法 (Linear Spectral Clustering)
    lsc = cv2.ximgproc.createSuperpixelLSC(img)
    lsc.iterate(10)
    mask_lsc = lsc.getLabelContourMask()
    label_lsc = lsc.getLabels()
    number_lsc = lsc.getNumberOfSuperpixels()
    mask_inv_lsc = cv2.bitwise_not(mask_lsc)
    img_lsc = cv2.bitwise_and(img, img, mask=mask_inv_lsc)

    plt.figure(figsize=(9, 7))
    plt.subplot(221), plt.axis('off'), plt.title("Origin image")
    plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 显示 img(RGB)
    plt.subplot(222), plt.axis('off'), plt.title("SLIC image")
    plt.imshow(cv2.cvtColor(img_slic, cv2.COLOR_BGR2RGB))
    plt.subplot(223), plt.axis('off'), plt.title("SEEDS image")
    plt.imshow(cv2.cvtColor(img_seeds, cv2.COLOR_BGR2RGB))
    plt.subplot(224), plt.axis('off'), plt.title("LSC image")
    plt.imshow(cv2.cvtColor(img_lsc, cv2.COLOR_BGR2RGB))
    plt.tight_layout()
    plt.show()

【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较_第1张图片

(本节完)


版权声明:

OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124643780)

Copyright 2022 youcans, XUPT
Crated:2022-5-8


欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割
【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割
【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较
更多内容,请见:
【OpenCV 例程200篇 总目录-202206更新】

你可能感兴趣的:(opencv,python,计算机视觉,图像处理,聚类)