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

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

Затем я пробую simpleITK с python, появляются проблемы. Во-первых, он работает очень медленно с каждым файлом .mha и получает очень большой файл (36,7 МБ по сравнению с 4,4 МБ при использовании Slicer) после применения коррекции n4biasfield. Во-вторых, чтобы ускориться, я установил параметр 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)


person Chen    schedule 25.03.2017    source источник


Ответы (1)


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

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

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

person g.stevo    schedule 30.03.2017
comment
Спасибо вам большое за ваш ответ. И да, когда я добавляю Cast на вывод в int16, весь размер уменьшился до 17,9M. И я заметил, что код, загруженный по ссылке, написан на C++. Возможно, мне нужно потратить больше времени, чтобы понять, как использовать их на платформе ОС. Некоторые проблемы все еще остались, например, он работает очень медленно, и результат размыт даже после того, как я изменил параметр WeinerFilterNoise на 0,01. - person Chen; 04.04.2017