Добавить дополнительные свойства в regionprops в skimage

#python #numpy #computer-vision #scikit-image #superpixels

#python #numpy #компьютерное зрение #scikit-изображение #суперпиксели

Вопрос:

Я использую regionprops функцию из scikit-imag пакета e (или skimage ) для вычисления объектов региона сегментированного изображения с использованием алгоритма SLIC superpixel из того же пакета.

Мне нужны дополнительные функции, чем те, которые вычисляются в функции, в основном: стандартное отклонение, асимметрия, эксцесс.

Я изменил исходный код _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? Я действительно не знаю, как использовать этот параметр.

Спасибо

Ответ №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
  

ОТРЕДАКТИРУЙТЕ 28.08.2021, обновил пример, чтобы фактически вычислять локальную статистику региона, как указано @CrisLuengo и @JDWarner (спасибо, ребята)

Комментарии:

1. Спасибо, я думал, что у меня есть ответ, но я забыл добавить intensity_image для своих функций. Получен ответ на вопрос.

Ответ №2:

Приведенный выше принятый ответ Филиппо (редактировать: был — теперь исправлен; далее следует исходное сообщение) слегка некорректен опасным образом. Статистика, возвращаемая с этим ответом, применяется к интенсивностям всей ограничивающей рамки, а не к замаскированному и помеченному субрегиону! Переданные расширенные функции необходимо использовать 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))
  

Это позволит корректно создавать локальную статистику только для помеченных областей изображения интенсивности.

У меня пока нет достаточной «репутации», чтобы прокомментировать этот ответ, поэтому отправляю как отдельный ответ, поскольку это важное различие.

Комментарии:

1. Спасибо! смотрите обновленный ответ и комментарии, пожалуйста, дайте мне знать, если что-то все еще не так

Ответ №3:

Я нашел ссылку в документе ветки разработчиков 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