超像素经典 SLIC 算法 python 实现

在这里插入图片描述

摘要

本文是研究生课程图像处理期末作业,内容是了解并入门超像素算法原理,主要介绍了超像素的评测标准,经典算法 SLIC,讨论了 SLIC 算法中的不足之处,以及 SLIC 的两个有效的改进算法 SEEDS 和 ETPS。
文章内容见我的码云

python3 代码

运算速度慢但是便于理清 SLIC 算法的参考实现

import math
from skimage import io, color
import numpy as np
from tqdm import trange
from tqdm import tqdm

class Cluster(object):
    cluster_index = 1

    def __init__(self, h, w, l=0, a=0, b=0):
        self.update(h, w, l, a, b)
        self.pixels = []
        self.no = self.cluster_index
        Cluster.cluster_index += 1

    def update(self, h, w, l, a, b):
        self.h = h
        self.w = w
        self.l = l
        self.a = a
        self.b = b

    def __str__(self):
        return "{},{}:{} {} {} ".format(self.h, self.w, self.l, self.a, self.b)

    def __repr__(self):
        return self.__str__()


class SLICProcessor(object):
    @staticmethod
    def open_image(path):
        """
        Return:
            3D array, row col [LAB]
        """
        rgb = io.imread(path)
        lab_arr = color.rgb2lab(rgb)
        return lab_arr

    @staticmethod
    def save_lab_image(path, lab_arr):
        """
        Convert the array to RBG, then save the image
        :param path:
        :param lab_arr:
        :return:
        """
        rgb_arr = color.lab2rgb(lab_arr)
        io.imsave(path, rgb_arr)

    def make_cluster(self, h, w):
        h = int(h)
        w = int(w)
        return Cluster(h, w,
                       self.data[h][w][0],
                       self.data[h][w][1],
                       self.data[h][w][2])

    def __init__(self, filename, K, M):
        self.K = K
        self.M = M

        self.data = self.open_image(filename)
        self.image_height = self.data.shape[0]
        self.image_width = self.data.shape[1]
        self.N = self.image_height * self.image_width
        self.S = int(math.sqrt(self.N / self.K))

        self.clusters = []
        self.label = {
   }
        self.dis = np.full((self.image_height, self.image_width), np.inf)

    def init_clusters(self):
        h = self.S // 2
        w = self.S // 2
        while h < self.image_height:
            while w < self.image_width:
                self.clusters.append(self.make_cluster(h, w))
                w += self.S
            w = self.S // 2
            h += self.S

    def get_gradient(self, h, w):
        if w + 1 >= self.image_width:
            w = self.image_width - 2
        if h + 1 >= self.image_height:
            h = self.image_height - 2

        gradient = self.data[h + 1][w + 1][0] - self.data[h][w][0] + \
                   self.data[h + 1
  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 像素 (Super-Pixel) 是一种图像处理方法,旨在将图像分割成较小的、均匀的像素块,以便于进行进一步的分析和处理。 在 Python 中,你可以使用 scikit-image 库中的 segmentation 模块来实现像素。你可以使用其中的 slic() 函数来将图像分割成像素。例如: ```python from skimage import io, segmentation # 读取图像 image = io.imread("image.png") # 将图像分割成像素 segments = segmentation.slic(image, n_segments=100, compactness=10.0) ``` 你还可以使用 quickshift 算法实现像素。例如: ```python from skimage import io, segmentation # 读取图像 image = io.imread("image.png") # 将图像分割成像素 segments = segmentation.quickshift(image, kernel_size=3, max_dist=6, ratio=0.5) ``` 你也可以使用其他库,如 OpenCV,来实现像素。例如,你可以使用 OpenCV 中的 pyrMeanShiftFiltering() 函数来实现像素。 ```python import cv2 # 读取图像 image = cv2.imread("image.png") # 将图像分割成像素 segments = cv2.pyrMeanShiftFiltering(image, sp=5, sr=5, maxLevel=1, termcrit=(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 5, 1)) ``` 希望这些信息能帮到你。 ### 回答2: 像素是一种图像分割的技术,它能够将原先的像素点聚合成具有相似特征的区域,从而减少图像的细节信息而保留主要结构。Python是一种非常流行的编程语言,也提供了众多图像处理库和算法实现。下面是关于用Python实现像素的简要描述: 首先,我们可以使用Python中的OpenCV库来读取和显示图像。通过使用OpenCV提供的函数,我们可以很方便地加载图像并将其转换为numpy数组以便后续处理。 接下来,我们可以使用常见的像素算法,如SLIC(简单线性迭代聚类)或Felzenszwalb算法,对图像进行像素分割。这些算法都有相应的Python实现,可以从开源的图像处理库中获取。例如,OpenCV中提供了cv2.ximgproc.segmentation.createSuperpixelSLIC函数,可以很方便地实现SLIC算法。 分割得到的像素通常表示为具有相同标识符的区域。然后,我们可以根据需要对像素区域进行进一步分析或处理。例如,对于图像分割任务,我们可以利用像素的特征进行像素级别的分类。 最后,我们可以使用OpenCV等库将分割后的像素可视化。通过将像素区域的边界标记为不同的颜色,我们可以展示像素对原始图像的分割效果。 总之,基于Python的图像处理库和算法,我们可以方便地实现像素分割。通过加载图像、选择合适的像素算法、进一步处理像素区域和可视化结果,我们可以实现对图像的高效分割和处理。 ### 回答3: 像素(Superpixel)是图像中一组紧密相连的像素的集合,可以认为是对图像进行了分割并对分割结果进行了合并。像素在计算机视觉领域有广泛的应用,如目标检测、图像分割、图像去噪等。 Python实现像素可以使用OpenCV库和scikit-image库。下面是一个使用OpenCV库实现像素的示例代码: ``` import cv2 # 读取图像 image = cv2.imread('image.jpg') # 转换为Lab颜色空间 lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab) # 创建Superpixel分割器 superpixels = cv2.ximgproc.createSuperpixelSLIC(lab, region_size=10, ruler=10.0) # 进行像素分割 superpixels.iterate(10) # 获取像素标记结果 labels = superpixels.getLabels() # 绘制像素边界 mask = superpixels.getLabelContourMask() # 使用彩色边界绘制原图 result = cv2.bitwise_and(image, image, mask=mask) result = cv2.drawContours(result, contours, -1, (0, 255, 0), 2) # 显示结果 cv2.imshow('Superpixels', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码首先读取一张图像,然后将图像转换为Lab颜色空间,接着创建Superpixel分割器,并进行像素分割。最后,获取像素标记结果,绘制像素边界,并将结果显示出来。 当然,除了OpenCV库外,还可以使用scikit-image库中的`skimage.segmentation.slic`函数实现像素分割。使用方法与上述示例类似,只需要替换对应的函数和参数即可。 总之,Python提供了多种实现像素的方法和库,根据具体需求选择适合的实现方式,可以轻松完成像素分割任务。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值