Я делаю проект по сегментации медицинского изображения и у меня проблемы с выравниванием масок и повреждений. Я пытаюсь использовать пакет SimpleITK
для исправления файлов масок (.nrrd
) на основе их метаданных. Я предполагаю, что все изображения имеют одинаковые метаданные (интервал, направление, происхождение), указанные в коде константами по умолчанию.
Добавленный код не делает то, что я хочу - вместо того, чтобы перемещать маску на небольшое количество, он просто устанавливает каждый элемент в маске на ноль. Кто-нибудь знает, что я делаю не так? ResampleImageFilter
нужное мне преобразование?
Я также согласен с решениями, использующими другие библиотеки.
import SimpleITK as sitk
import numpy as np
DEFAULT_DIRECTION = (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)
DEFAULT_SPACE = (1., 1., 1.)
DEFAULT_ORIGIN = (0.0, 0.0, 0.0)
def projectImage(image, mask):
image.SetSpacing(DEFAULT_SPACE)
image.SetDirection(DEFAULT_DIRECTION)
image.SetOrigin(DEFAULT_ORIGIN)
resample = sitk.ResampleImageFilter()
resample.SetReferenceImage(image)
resample.SetInterpolator(sitk.sitkNearestNeighbor)
resampledimg = resample.Execute(mask)
return resampledimg
image = np.load('SAM.npy') # (54, 512, 512)
mask_sitk = sitk.ReadImage('SAM.nrrd')
sitk_image = sitk.GetImageFromArray(image) # Transform fails even if I transpose image.
alignedmask = projectImage(sitk_image, mask_sitk)
alignedmasknpy = sitk.GetArrayFromImage(alignedmask).T # (54, 512, 512)
mask_arr = sitk.GetArrayFromImage(mask_sitk) # (512, 512, 54)
imgnpy = sitk.GetArrayFromImage(sitk_image).T # (54, 512, 512)
print(alignedmasknpy.max()) # 0
print(mask_arr.max()) # 1