#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