itk序列文件使用单个图像读取器读取后不再保持成一个序列的问题
情形说明
医学图像中,一个三维图像通常保存为一个序列二维图像,即多张2D图像。反过来,也即是一系列二维图像重建后可以形成一个三维图像,这些相互关联的二维图像我称为一个序列图像。 即1*3D = N * 2D。
对于这一序列图像,其中存在一些标志信息用以标识其属于同一序列。
具体情况
如果使用 i t k I m a g e F i l e R e a d e r . h itkImageFileReader.h itkImageFileReader.h, 并为其设置一个 i t k G D C M I m a g e I O . h itkGDCMImageIO.h itkGDCMImageIO.h实例 用于读取序列图像中的一张,再使用 i t k I m a g e F i l e W r i t e r . h itkImageFileWriter.h itkImageFileWriter.h 并为其设置一个 i t k G D C M I m a g e I O . h itkGDCMImageIO.h itkGDCMImageIO.h实例用于将该图像保存到本地,则保存后的单个图像和未被读写的图像通常不再属于同一个序列。
上图为一个序列,含有256张图像。
上图为其中一张图像经过读写之后, 该序列被分成了两个序列,其中一个为 单独读写过后的图像, 未被读写的255张图像仍然保持为原来的序列。
如果对序列中的所有图像都经过一次单独读写,则256张图像会成为256个序列,每个序列只有1张图像。
问题引出
某些情况下,需要对序列中单个图像进行处理,并且整个序列中的单个文件都需要进行相同操作(比如修改序列文件的tag标签),则上述直接的单个修改文件方法将不合适。上述修改标签在单个2D文件上进行修改,序列中所有2D标签都需要执行相同的操作,最重要的是修改完成后仍使其保持为同一个序列文件。
解决方案
使用 I O F a c t o r y IOFactory IOFactory代替单个 I O IO IO,比如在处理单个文件的类中,注册一个 I O F a c t o r y IOFactory IOFactory,然后在处理整个序列的类中都使用该单个文件类的实例进行处理。
比如,单个文件tag信息处理类
D
i
c
o
m
S
i
n
g
l
e
F
i
l
e
T
a
g
U
p
d
a
t
e
r
DicomSingleFileTagUpdater
DicomSingleFileTagUpdater中,注册一个IO工厂
i
t
k
:
:
G
D
C
M
I
m
a
g
e
I
O
F
a
c
t
o
r
y
:
:
R
e
g
i
s
t
e
r
O
n
e
F
a
c
t
o
r
y
(
)
;
itk::GDCMImageIOFactory::RegisterOneFactory();
itk::GDCMImageIOFactory::RegisterOneFactory();,
然后在处理整个序列时(如类
D
i
c
o
m
S
e
r
i
e
s
F
i
l
e
s
U
p
d
a
t
e
r
DicomSeriesFilesUpdater
DicomSeriesFilesUpdater),只使用一个
D
i
c
o
m
S
i
n
g
l
e
F
i
l
e
T
a
g
U
p
d
a
t
e
r
DicomSingleFileTagUpdater
DicomSingleFileTagUpdater类实例
s
i
n
g
l
e
U
p
d
a
t
e
r
singleUpdater
singleUpdater来处理,
则可以实现整个序列处理完后,仍为一个完整序列。