python 自带slic代码分析

python 自带slic代码分析一 python 中的 slic 函数 defslic image n segments 100 compactness 10 max iter 10 sigma 0 spacing None multichannel True convert2lab None enforce connectivity True min size fact

一.python中的slic函数

 def slic(image, n_segments=100, compactness=10., max_iter=10, sigma=0, spacing=None, multichannel=True, convert2lab=None, enforce_connectivity=True, min_size_factor=0.5, max_size_factor=3, slic_zero=False): """Segments image using k-means clustering in Color-(x,y,z) space. Parameters ---------- image : 2D, 3D or 4D ndarray Input image, which can be 2D or 3D, and grayscale or multichannel (see `multichannel` parameter). n_segments : int, optional The (approximate) number of labels in the segmented output image. compactness : float, optional 控制颜色和空间之间的平衡,约高越方块,和图关系密切,最好先确定指数级别,再微调 Balances color proximity and space proximity. Higher values give more weight to space proximity, making superpixel shapes more square/cubic. In SLICO mode, this is the initial compactness. This parameter depends strongly on image contrast and on the shapes of objects in the image. We recommend exploring possible values on a log scale, e.g., 0.01, 0.1, 1, 10, 100, before refining around a chosen value. max_iter : int, optional 最大k均值迭代次数 Maximum number of iterations of k-means. sigma : float or (3,) array-like of floats, optional 图像每个维度进行预处理时的高斯平滑核宽。若给定为标量值,则同一个值运用到各个维度。0意味 着不平滑。如果“sigma”是标量的,并且提供了手动体素间距,则自动缩放它(参见注释部分)。 Width of Gaussian smoothing kernel for pre-processing for each dimension of the image. The same sigma is applied to each dimension in case of a scalar value. Zero means no smoothing. Note, that `sigma` is automatically scaled if it is scalar and a manual voxel spacing is provided (see Notes section). spacing : (3,) array-like of floats, optional 代表沿着图像每个维度的体素空间。默认情况下,slic假定均匀的空间(沿x,y,z轴相同的体素分辨 率),这个参数控制在k均值聚类中各轴距离的权重 The voxel spacing along each image dimension. By default, `slic` assumes uniform spacing (same voxel resolution along z, y and x). This parameter controls the weights of the distances along z, y, and x during k-means clustering. multichannel : bool, optional 二进制参数,代表图像的最后一个轴代表多通道还是另一个空间维度 Whether the last axis of the image is to be interpreted as multiple channels or another spatial dimension. convert2lab : bool, optional 二进制参数,判断输入需要在分割之前转到LAB颜色空间。输入必须是RGB。当多通道参数为True, 输入图片的通道数为3时,该参数默认为True Whether the input should be converted to Lab colorspace prior to segmentation. The input image *must* be RGB. Highly recommended. This option defaults to ``True`` when ``multichannel=True`` *and* ``image.shape[-1] == 3``. enforce_connectivity: bool, optional 二进制参数,控制生成的分割块连接或不连接 Whether the generated segments are connected or not min_size_factor: float, optional 与分割目标数有关的要删去的最小分割块比率,(大概是小于长*宽*高/目标数量 的分割结果会被融 合掉) Proportion of the minimum segment size to be removed with respect to the supposed segment size ```depth*width*height/n_segments``` max_size_factor: float, optional 最大融合比率上限 Proportion of the maximum connected segment size. A value of 3 works in most of the cases. slic_zero: bool, optional 不知所谓的零参数 Run SLIC-zero, the zero-parameter mode of SLIC. [2]_ Returns ------- labels : 2D or 3D array Integer mask indicating segment labels. Raises ------ ValueError If ``convert2lab`` is set to ``True`` but the last array dimension is not of length 3. Notes ----- * If `sigma > 0`, the image is smoothed using a Gaussian kernel prior to segmentation. * If `sigma` is scalar and `spacing` is provided, the kernel width is divided along each dimension by the spacing. For example, if ``sigma=1`` and ``spacing=[5, 1, 1]``, the effective `sigma` is ``[0.2, 1, 1]``. This ensures sensible smoothing for anisotropic images. 如果有平滑参数sigma和体素空间参数spacing,那么空间体素参数会对平滑参数有平分的影响,比如 1/[5,1,1]=[0.2,1,1] * The image is rescaled to be in [0, 1] prior to processing. 图像在预处理之前会被处理为[0,1]之间的标量 * Images of shape (M, N, 3) are interpreted as 2D RGB images by default. To interpret them as 3D with the last dimension having length 3, use `multichannel=False`. (M,N,3)的图像默认为2维(RGB的图像),要想被理解为3维图需要设置多通道参数=False References ---------- .. [1] Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sabine Süsstrunk, SLIC Superpixels Compared to State-of-the-art Superpixel Methods, TPAMI, May 2012. .. [2] http://ivrg.epfl.ch/research/superpixels#SLICO Examples -------- >>> from skimage.segmentation import slic >>> from skimage.data import astronaut >>> img = astronaut() >>> segments = slic(img, n_segments=100, compactness=10) Increasing the compactness parameter yields more square regions: >>> segments = slic(img, n_segments=100, compactness=20) """ 干正事啦 image = img_as_float(image) is_2d = False #2D灰度图 if image.ndim == 2: # 2D grayscale image image = image[np.newaxis, ..., np.newaxis] is_2d = True #比如2D RGB的图 elif image.ndim == 3 and multichannel: # Make 2D multichannel image 3D with depth = 1 image = image[np.newaxis, ...] is_2d = True #比如3D图 elif image.ndim == 3 and not multichannel: # Add channel as single last dimension image = image[..., np.newaxis] #控制聚类时各轴权重 if spacing is None: spacing = np.ones(3) elif isinstance(spacing, (list, tuple)): spacing = np.array(spacing, dtype=np.double) #高斯平滑 if not isinstance(sigma, coll.Iterable): sigma = np.array([sigma, sigma, sigma], dtype=np.double) sigma /= spacing.astype(np.double)#有可能发生的体素除 elif isinstance(sigma, (list, tuple)): sigma = np.array(sigma, dtype=np.double) #高斯滤波处 if (sigma > 0).any(): # add zero smoothing for multichannel dimension sigma = list(sigma) + [0] image = ndi.gaussian_filter(image, sigma) #多通道RGB图且需要转lab,用rab2lab即可实现 if multichannel and (convert2lab or convert2lab is None): if image.shape[-1] != 3 and convert2lab: raise ValueError("Lab colorspace conversion requires a RGB image.") elif image.shape[-1] == 3: image = rgb2lab(image) depth, height, width = image.shape[:3] # initialize cluster centroids for desired number of segments #为实现目标分割块数,初始化聚类中心。 #grid_* 相当于index #slices是根据目标数量分的块,有取整需要 grid_z, grid_y, grid_x = np.mgrid[:depth, :height, :width] slices = regular_grid(image.shape[:3], n_segments) step_z, step_y, step_x = [int(s.step if s.step is not None else 1) for s in slices] segments_z = grid_z[slices] segments_y = grid_y[slices] segments_x = grid_x[slices] segments_color = np.zeros(segments_z.shape + (image.shape[3],)) segments = np.concatenate([segments_z[..., np.newaxis], segments_y[..., np.newaxis], segments_x[..., np.newaxis], segments_color], axis=-1).reshape(-1, 3 + image.shape[3]) segments = np.ascontiguousarray(segments) # we do the scaling of ratio in the same way as in the SLIC paper # so the values have the same meaning step = float(max((step_z, step_y, step_x))) ratio = 1.0 / compactness #我类个去,分割时方不方的骚操作 image = np.ascontiguousarray(image * ratio) labels = _slic_cython(image, segments, step, max_iter, spacing, slic_zero) #把过小过小的处理一下 if enforce_connectivity: segment_size = depth * height * width / n_segments min_size = int(min_size_factor * segment_size) max_size = int(max_size_factor * segment_size) labels = _enforce_label_connectivity_cython(labels, min_size, max_size) if is_2d: labels = labels[0] return labels

二、注意事项

1.要不要转化到LAB空间是可以调的,当然啦不转的结果就是方方正正的空间分割,和内容毫无关系,比如下图

convert2lab or convert2lab is None 这段代码可以看出来,不传参数和传参数为True都是转到lab了,完美。

python 自带slic代码分析

 

2.分割结果比设置的少是因为做了一下后处理,调一下enforce_connectivity就变多啦,但不是一定分割结果和设置数量一样的。比如下图,设置分割20,参数设置为False结果为12块,参数设置为True就是3块

python 自带slic代码分析

python 自带slic代码分析

分割目标数量恰当的话(比如100),是这样的:

python 自带slic代码分析

 

三、SLCI的使用

from __future__ import division from skimage.segmentation import slic,mark_boundaries from skimage import io import matplotlib.pyplot as plt import numpy as np img = io.imread("imgs\style\DTD\\denoised_starry.jpg") print(img.shape) segments = slic(img, n_segments=100, compactness=20,enforce_connectivity=True,convert2lab=True) print(segments.shape) n_liantong=segments.max()+1 print('n_liantong:',n_liantong) area=np.bincount(segments.flat) w,h=segments.shape print(area/(w*h)) print((max(area/(w*h))),(min(area/(w*h)))) out=mark_boundaries(img,segments) plt.subplot(111) plt.imshow(out) plt.show()

四、参考一的代码做修改

相对导入报错:

ValueError: attempted relative import beyond top-level package

 

调用关系需要做一下修改,

原:

from ..util import img_as_float, regular_grid from ..segmentation._slic import (_slic_cython, _enforce_label_connectivity_cython) from ..color import rgb2lab

修改后:

from skimage.util import img_as_float, regular_grid from skimage.segmentation._slic import (_slic_cython, _enforce_label_connectivity_cython) from skimage.color import rgb2lab

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233429.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 国外常用的免费DNS域名解析服务器「建议收藏」

    国外常用的免费DNS域名解析服务器「建议收藏」在国内注册的域名默认使用的是国内域名注册商提供的DNS服务器,国内的DNS服务器可能受政策的影响停止解析域名,网络上传说以后没有BeiAn的域名国内将不给解析。为了避免国内的这些政策,建议使用国外的域名服务:如果您还没有注册域名,请不要在国内注册域名。如果您已经在国内注册了域名,但由于国内注册商赖皮,不给您转移密码,您还可以使用国外的免费DNS服务器。国外免费DNS

    2022年6月22日
    187
  • (4.31)quotename函数

    (4.31)quotename函数操作sqlserver尤其是写存储过程时,要用到各种各样的函数,今天就总结一个quotename()的用法。1.语法:quotename(‘character_string’[,‘quote_character’])[]里面的内容说明可以省略,缺省情况下,说明用‘[]’引用。character_string,unicode字符数据构成的字符串。character_string是s…

    2022年7月25日
    5
  • 怎样更改pycharm的项目默认保存路径_vscode怎么给python导入包

    怎样更改pycharm的项目默认保存路径_vscode怎么给python导入包 参考原文:https://blog.csdn.net/yggaoeecs/article/details/78378938  还有这篇,同时讲了anaconda的安装:https://blog.csdn.net/qq_29883591/article/details/78077244https://blog.csdn.net/qq_29883591/article/details/78…

    2022年8月27日
    5
  • Java的in.nextInt()和in.nextLine()方法的具体内涵[通俗易懂]

    Java的in.nextInt()和in.nextLine()方法的具体内涵[通俗易懂]本人也是刚开始学习java语言,在学习的过程中,老师让我们做一个模拟学生学籍管理系统的小程序。因为刚开始,做的是比较简单的,用switch语句做界面,然后配合Scanner接收输入的数字进行跳转,完成各类操作。因为跳转时输入的是数字,而跳转后的操作要输入字符串,比如:“选择1添加学生信息…输入添加学生的姓名…”这类的操作在测试的时候总是无法输入字符串像这个样子,先用nextInt()再用…

    2022年5月5日
    81
  • SQL Server 2008 R2 详细安装图文教程

    SQL Server 2008 R2 详细安装图文教程SQLServer2008R2安装教程1、打开安装包,点击setup.exe2、选择左侧列表中的“安装”。3、点击“全新安装或向现有安装添加功能”。4、检测完成点击确定。5、选择版本和密钥,然后下一步。(因为有版权要求,在这不能给安装密钥,需要安装密钥的请私信博主)6、选择“我接受许可条款”。点击下一步7、点击“安装”。8、…

    2022年6月23日
    46
  • windows版mysql8.0安装详解

    windows版mysql8.0安装详解windows版mysql8.0安装详解准备去下载一个本地mysql服务器时,突然发现mysql从5.7瞬间升级为8.0了,那还等什么,直接下载下来玩玩先.下载地址:https://dev.mysql.com/downloads/mysql/下载完成后将其解压到自定义目录下,我所有的工具都保存在D:\tools,解压完成后会看见以下目录:随后…

    2022年5月4日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号