Выполнение трехмерной колокализации и измерения расстояния с помощью SimpleITK - PullRequest
0 голосов
/ 28 октября 2019

У меня есть несколько довольно больших (~ 150 МБ) 3-канальных 3D-изображений, которые я пытаюсь обработать с помощью python-simpleitk. Мне нужно определить, перекрываются ли объекты в красном канале с объектами в зеленом канале, и определить их расстояние от объекта в синем канале.

Я не нашел ничего о колокализации в документации по simpleitk, поэтому я 'мы пытались это сделать, используя numpy для извлечения координат и определения количества перекрывающихся вокселей. Я еще нигде не нашел какого-либо конкретного метода измерения расстояния от края до края.

Однако, как и ожидалось, пустая версия занимает довольно много времени, и я бы предпочел использовать simpleitk для этого (ятакже изучал обычные itk, но это вызывает проблемы с конвертацией в ndarrays).

Интересно, кому-нибудь повезло, если бы выполнял этот тип обработки изображений с помощью этих инструментов. Или можете порекомендовать улучшения.

Вот мой код.

class ChannelImage(object):

    def __init__(self, image:np.ndarray, metadata:dict):
        self.object_map = None
        self.image = sitk.GetImageFromArray(image)
        self.metadata = metadata
        self.channel_ID = metadata['Color']
        # threshold hardcoded for now.
        if self.channel_ID == "Blue":
            self.threshold = 20000
        else:
            self.threshold = 10000
        del self.metadata['ID']
        del self.metadata['Color']

    def get_coords(self):
        cc = sitk.ConnectedComponent(self.image>self.threshold)
        self.object_map = sitk.GetArrayFromImage(cc)
        stats = sitk.LabelIntensityStatisticsImageFilter()
        stats.Execute(cc, self.image)
        labels = stats.GetLabels()
        print(f"Getting coordinates for {self.channel_ID}")
        self.coords = {label:np.where(self.object_map==label) for label in labels}

1 Ответ

1 голос
/ 29 октября 2019

SimpleITK в настоящее время не имеет метода для непосредственного получения координат метки. Я бы рекомендовал открыть запрос функции для SimpleITK.

В то же время вы можете повысить эффективность np.where, обрезав ndarray на основе метода sitk.LabelIntensityStatisticsImageFilter.GetBoundingBox().

...