Skip to content

SuperPixels

来自本人笔记: https://github.com/masterAllen/LearnOpenCV/blob/main/docs/0.7.md

什么是 superpixels,一图胜千言:

1727267590000

AI 的回答:每个块被称为一个超像素,这些超像素通常包含相似的颜色、纹理和亮度等特征,使得它们在视觉上具有一定的连贯性和意义。使用超像素的主要优点包括:

1. 降低计算复杂度:通过使用较少的超像素代替大量像素,可以简化后续图像处理任务,如图像分割、特征提取等。

2. 保留图像结构:超像素在分割图像的同时,尽量保持了图像中物体的边界信息,使得分割结果更符合视觉感知。

3. 提高处理速度:在进行图像处理时,如使用图论方法分离前景背景,使用超像素可以大大减少需要处理的节点数,从而加快处理速度。

4. 特征提取:超像素可以用于提取颜色直方图、纹理信息等特征,有助于后续的图像分析任务。

5. 图像重建:超像素可以用于图像的压缩和重建,通过保留主要特征来减少数据量。

6. 增强区域连通性:在分割过程中,可以通过增强连通性来解决超像素过小或不连续的问题。

7. 应用于深度学习:超像素可以集成到深度学习模型中,用于学习任务特定的超像素特征,提高模型性能。

8. 多领域应用:超像素在医学图像分割、视频前景分割、目标跟踪、骨架提取、人体姿态估计等多个领域都有应用。

OpenCV 中 ximgproc 有一节专门负责 SuperPixels,有三类,看代码即可,代码如下:

import cv2
import numpy as np
from utils import show_images

src = cv2.imread('image/edge/sources/06.png')

'''
class   cv::ximgproc::SuperpixelLSC
class   cv::ximgproc::SuperpixelSEEDS
class   cv::ximgproc::SuperpixelSLIC
'''

rgb_src = cv2.imread('image/edge/sources/06.png')
hsv_src = cv2.cvtColor(rgb_src, cv2.COLOR_BGR2HSV)

# SEEDS 参数,请自行调整,原来 samples 文件对各个参数有 trackbar 调整方式,参数后面的注释就是其中的最大值
prior = 2               # 5
num_levels = 4          # 10
num_iterations = 4      # 1000
num_superpixels = 400   # 1000

num_histogram_bins = 5
double_step = False

seeds = cv2.ximgproc.createSuperpixelSEEDS(src.shape[1], src.shape[0], src.shape[2], num_superpixels, num_levels, prior, num_histogram_bins, double_step)
seeds.iterate(hsv_src, num_iterations)

# SLIC 参数
region_size = 50        # 200
ruler = 30              # 100
min_element_size = 50   # 100
num_iterations = 4      # 12
algorithm = cv2.ximgproc.SLIC   # SLIC, SLICO, MSLIC

slic = cv2.ximgproc.createSuperpixelSLIC(hsv_src, algorithm, region_size, ruler)
slic.iterate(num_iterations)
slic.enforceLabelConnectivity(min_element_size)

# LSC 参数
region_size = 10
ration = 0.075
num_iterations = 4

lsc = cv2.ximgproc.createSuperpixelLSC(hsv_src, region_size, ruler)
lsc.iterate(num_iterations)


for now in [seeds, slic, lsc]:
    labels = now.getLabels()
    mask = now.getLabelContourMask()
    nowimg = np.copy(src)
    nowimg[mask != 0] = [0, 0, 255]

    show_images([
        ('src', rgb_src),
        ('result', nowimg),
        ('mask', mask),
        ('labels', labels)
    ])

Comments