SimpleItk обрезать изображение - PullRequest
1 голос
/ 21 апреля 2020

Сначала я хочу обрезать 3D-изображение с помощью simpleItk в Python3

, загрузить изображение и получить numpy массив

image_ct = sitk.ReadImage(path_ct, sitk.sitkInt16)
array_ct = sitk.GetArrayFromImage(image_ct)

, затем выполнить обрезку массива data

center = (200, 200, 200)
array_gt = array_gt[center[0]-50:center[0]+51, center[1]-50:center[1]+51, center[2]-40:center[2]+41]

Теперь я хочу создать sitk.Image из массива и сохранить результат

def create_ref_image(image, size=(101, 101, 81), spacing=(0.97, 0.97, 0.97), dimension=3):

    ref_origin = np.zeros(dimension)
    ref_direction = np.identity(dimension).flatten()
    ref_image = sitk.Image(size, image.GetPixelIDValue())
    ref_image.SetOrigin(ref_origin)
    ref_image.SetSpacing(spacing)
    ref_image.SetDirection(ref_direction)

    return ref_image

ref_img = create_ref_image(image_ct)
cropped_img = sitk._SimpleITK._SetImageFromArray(np.ascontiguousarray(array_gt), ref_img)
sitk.WriteImage(cropped_img, "/DATA/exemple.nii")

, но затем я получаю эту ошибку

File ".. ./anaconda3/envs/objD/lib/python3.6/site-packages/SimpleITK/SimpleITK.py ", строка 8207, в WriteImage return _SimpleITK.WriteImage (* args) ValueError: недопустимая нулевая ссылка в методе 'WriteImage' , аргумент 1 типа 'itk :: simple :: Image const &'

Как обрезать изображение с помощью SimpleItk (в python)?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

В дополнение к кадрированию с помощью нарезки Python SimpleITK имеет функцию Crop и CropImageFilter.

Вот do c для функции кадрирования:

https://itk.org/SimpleITKDoxygen/html/namespaceitk_1_1simple.html#a4458c40720e7d78ace07181e13064865

и CropImageFilter:

https://itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1CropImageFilter.html

Функциональность такая же, как нарезка, но если вам нужно обрезать количество изображений одинаково, может быть удобно иметь объект CropImageFilter, который выполняется для всех изображений.

1 голос
/ 21 апреля 2020

Оказывается, вы можете просто использовать оператор нарезки непосредственно на sitk.Image;

image_ct = image_ct[center[0]-50:center[0]+51, center[1]-50:center[1]+51, center[2]-40:center[2]+41]

sitk.WriteImage(image_ct, "/DATA/exemple.nii")
...