У меня есть несколько довольно больших (~ 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}