4

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

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

我修改了使用其他功能作为模板的源代码,_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 获得一个工作示例吗?我真的不知道如何使用这个参数。

谢谢

4

3 回答 3

6

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

编辑 2021 年 8 月 28 日,更新了示例以实际计算区域本地统计数据,正如 @CrisLuengo 和 @JDWarner 所指出的(谢谢你们)

于 2020-08-19T09:36:25.107 回答
4

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))

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

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

于 2021-08-27T18:55:01.553 回答
1

我在 .dev 分支的文档中找到了一个参考skimage。它包含在 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
于 2020-08-19T08:46:16.927 回答