simpleITK N4BiasFieldCorrection работает странно с точки зрения скорости работы и результатов

Я делаю проект о сегментации опухоли головного мозга. И когда я применил N4BiasCorrection к своему файлу (.mha), я использовал методы Slicer и simpleITK. Slicer работает хорошо, но требует много времени, потому что я не знаю, как использовать код для запуска всего моего файла, я просто использую модуль Slicer-N4ITK и обрабатываю каждый файл вручную.

Затем я пытаюсь SimpleITK с Python, проблемы появляются. Во-первых, он работает очень медленно для каждого файла.mha и получает действительно большой файл (36,7 МБ по сравнению с 4,4 МБ с использованием Slicer) после применения n4biasfieldcorrection. Во-вторых, чтобы ускорить, я установил для параметра Shrink значение 4, но весь файл.mha стал действительно размытым, что не будет происходить при использовании слайсера.

Так может кто-нибудь сказать мне, нормально ли это? Есть ли способы ускорить, не размывая мой файл? Или не могли бы вы рассказать мне пример применения N4BiasFieldCorrection в Python-интеракторе Slicer.

Спасибо!!

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
from __future__ import print_function
import SimpleITK as sitk
import sys
import os
#from skimage import io
from glob import glob
import numpy as np


def n4process(inputimage, outpath):
    inputImage = sitk.ReadImage( inputimage )    
#    numberFilltingLevels = 4
    maskImage = sitk.OtsuThreshold( inputImage, 0, 1, 200 )
#    inputImage = sitk.Shrink( inputImage, [ 2 ] * inputImage.GetDimension() )
#    maskImage = sitk.Shrink( maskImage, [ 2 ] * inputImage.GetDimension() )
    inputImage = sitk.Cast( inputImage, sitk.sitkFloat32 )
    corrector = sitk.N4BiasFieldCorrectionImageFilter();
    corrector.SetConvergenceThreshold=0.001
    corrector.SetBiasFieldFullWidthAtHalfMaximum=0.15
    corrector.SetMaximumNumberOfIterations=50
    corrector.SetNumberOfControlPoints=4
    corrector.SetNumberOfHistogramBins=200
    corrector.SetSplineOrder=3
    corrector.SetWienerFilterNoise=0.1
    output = corrector.Execute( inputImage,maskImage )    
    sitk.WriteImage( output, outpath )

    
input_path = '/Users/chenrui/Desktop/BRATS2015_Training/HGG/'
patientpath = glob('/Users/chenrui/Desktop/BRATS2015_Training/HGG/*')
num = 0
for i in patientpath:
    num = num+1
#i = '/Users/chenrui/Desktop/BRATS2015_Training/HGG/brats_2013_pat0001_1'
    flair = glob(i + '/*Flair*/*.mha')
    flair_outpath = '/Users/chenrui/Desktop/BRATS2015_Training/test/'+'Flair/'+str(num)+'.mha'
    n4process(flair[0], flair_outpath)
    
    t2 = glob(i + '/*T2*/*.mha')
    t2_outpath = '/Users/chenrui/Desktop/BRATS2015_Training/HGG_n4/'+'T2/'+str(num)+'.mha'
    n4process(t2[0], t2_outpath)
    
    t1c = glob(i + '/*_T1c*/*.mha')
    t1c_outpath = '/Users/chenrui/Desktop/BRATS2015_Training/HGG_n4/'+'T1c/'+str(num)+'.mha'
    n4process(t1c[0], t1c_outpath)
    
    t1 = glob(i + '/*_T1*/*.mha')
    t1 = [scan for scan in t1 if scan not in t1c]
    t1_outpath = '/Users/chenrui/Desktop/BRATS2015_Training/HGG_n4/'+'T1/'+str(num)+'.mha'
    n4process(t1[0],t1_outpath)

1 ответ

Из взгляда на оригинальную реализацию http://www.insight-journal.org/browse/publication/640

Вы можете скачать это и сгенерировать пример для проверки ваших данных. Заданные вами параметры выглядят так же, как они определены в значениях по умолчанию, за исключением WeinerFilterNoise, который должен быть 0,01, если вы не изменили это по какой-то причине - это проблема размытия?

Разница в размере (увеличение в 8 раз) будет заключаться в том, что вы, вероятно, сохранили данные с 8 до 64 бит или что-то в этом роде. Проверка заголовка метаизображения покажет это. Это может быть решено с помощью кастинга.

Другие вопросы по тегам