【问题标题】:Add extra properties to regionprops in skimage在 skimage 中为 regionprops 添加额外的属性
【发布时间】:2020-12-08 10:09:24
【问题描述】:

我正在使用 scikit-image(或 skimage)包中的 regionprops 函数,使用同一包中的 SLIC 超像素算法计算分割图像的区域特征。

除了在函数中计算的那些之外,我还需要额外的特征,主要是:标准偏差、偏度、峰度。

我使用其他功能作为模板修改了_regionprops.py 的源代码,以便包含这些属性:

    @property
    def sd_intensity(self):
        return np.std(self.intensity_image[self.image])

    @property
    def skew_intensity(self):
        return skew(self.intensity_image[self.image])

我知道这是不好的做法,不是长期解决方案,因为我的代码将无法在另一台机器上运行,或者如果我更新 skimage。

我发现函数skimage.measure.regionprops() 有一个extra_properties=None 参数,根据文档:

添加 skimage 未包含的额外属性计算函数。

我的问题是:我可以使用 np.std 获得一个工作示例吗?这个参数我真的不知道怎么用。

谢谢

【问题讨论】:

    标签: python numpy computer-vision scikit-image superpixels


    【解决方案1】:

    extra_properties 只是将带有区域掩码和强度图像的函数列表作为参数。这是一个简单的例子:

    from skimage import data, util
    from skimage.measure import label, regionprops
    import numpy as np
    img = util.img_as_ubyte(data.coins()) > 110
    label_img = label(img, connectivity=img.ndim)
    
    def sd_intensity(regionmask, intensity_image):
            return np.std(intensity_image[regionmask])
    
    def skew_intensity(regionmask, intensity_image):
            return skew(intensity_image[regionmask])
        
    props = regionprops(label_img, intensity_image=img,
                        extra_properties=(sd_intensity, skew_intensity))
    

    您现在可以使用您的函数名称访问您的额外属性

    props[0].sd_intensity
    >>> 0.4847985617008998
    

    EDIT 08/28/2021,更新了示例以实际计算区域本地统计数据,正如 @CrisLuengo 和 @JDWarner 所指出的(谢谢大家)

    【讨论】:

    • 谢谢 我以为我有答案,但我忘了为我的功能添加intensity_image。问题已回答。
    【解决方案2】:

    filippo 上述接受的答案是(编辑:是 - 现在更正;原始帖子如下)以危险的方式巧妙地不正确。与该答案一起返回的统计信息应用于整个边界框的强度,而不是被屏蔽和标记的子区域!传递的扩展函数需要使用regionmask对强度图像进行切片。完整更正示例:

    import numpy as np
    from scipy.stats import skew
    from skimage import data, util
    from skimage.measure import label, regionprops
    
    img = util.img_as_ubyte(data.coins()) > 110
    label_img = label(img, connectivity=img.ndim)
    
    def sd_intensity(regionmask, intensity_image):
            return np.std(intensity_image[regionmask])  # Note slicing
    
    def skew_intensity(regionmask, intensity_image):
            return skew(intensity_image[regionmask])   # Note slicing
        
    props = regionprops(label_img, intensity_image=img,
                        extra_properties=(sd_intensity, skew_intensity))
    

    这将正确地为强度图像的标记区域生成局部统计数据。

    我还没有足够的“声誉”来评论那个答案,所以作为一个单独的答案提交,因为这是一个重要的区别。

    【讨论】:

    • 谢谢!查看更新的答案和 cmets,如果还有什么问题,请告诉我
    【解决方案3】:

    我在 skimage 的 dev 分支的文档中找到了参考。它包含在 0.18.dev0 版本中

    代码来源:https://github.com/scikit-image/scikit-image/blob/master/skimage/measure/_regionprops.py#L1028

    文档链接:https://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops

    # Add custom measurements by passing functions as ``extra_properties``
    from skimage import data, util
    from skimage.measure import label, regionprops
    import numpy as np
    
    img = util.img_as_ubyte(data.coins()) > 110
    label_img = label(img, connectivity=img.ndim)
    
    def pixelcount(regionmask):
        return np.sum(regionmask)
    
    props = regionprops(label_img, extra_properties=(pixelcount,))
    
    props[0].pixelcount
        7741
    props[1]['pixelcount']
        42
    

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多