RAW形式ボリュームデータをVTI形式に変換する
signed 16bit で格納されているRAW形式のボリュームデータを,VTK ImageDataファイル (vti) 形式に変換する Python プログラム.
VTI形式には Legacy と XML とがありますが,これはXML.
XMLにもテキストとバイナリとがありますが,これはテキスト.
色々と試行錯誤のあとがありますが,ご容赦ください.
使い方は
$ python3 raw2vtitxt.py in.raw out.vti width height slice
です.
コード
import sys
import numpy as np
import xml.etree.ElementTree as ET
def generateVtiTree():
    # XML ドキュメントの作成
    vtket = ET.Element('VTKFile',{'type':'ImageData'})
#    imagedata = ET.SubElement(vtkfile, 'ImageData', {'WholeExtent':'0 2 0 2 0 2'})
    imagedata = ET.SubElement(vtket,'ImageData')
    imagedata.set('WholeExtent','0 2 0 2 0 2')
    imagedata.set('Origin','0 0 0')
    imagedata.set('Spacing','1.0 1.0 1.0')
#    imagedata.text = '<Hello> world!'
    piece = ET.SubElement(imagedata, 'Piece', {'Extent':'0 2 0 2 0 2'})
    celldata = ET.SubElement(piece,'CellData',{'Scalars':'cell_values'})
    dataarray = ET.SubElement(celldata,'DataArray',{'Name':'cell_values'})
    dataarray.set('type','Int16')
    dataarray.set('format','ascii')
    dataarray.text = '1 2 3 4 5 6 7 8'
    return vtket
def setDataarray(vtket,vtext):
    for dataarray in vtket.iter('DataArray'):
        print;
#    dataarray.text = '8 7 6 5 4 3 2 1'
    dataarray.text = vtext
    return
def setSize(vtket,width,height,slice):
    strSize = '0 {0} 0 {1} 0 {2}'.format(width,height,slice)
#    print(strSize)
    for imagedata in vtket.iter('ImageData'):
        print;
    imagedata.set('WholeExtent',strSize)
    for piece in vtket.iter('Piece'):
        print;
    piece.set('Extent',strSize)
    return
def loadRawVolume( fp ):
    inVolume = np.fromfile(fp,np.int16,-1)
    fp.close()
    return inVolume
def convertNumpyToText(inVolume):
    mapped_list = map(str,inVolume)
    vtext = ' '.join(mapped_list)
    return vtext
def run(pathInfile,pathOutfile,width,height,slice):
    # load RAW to numpy
    fpInfile = open(pathInfile, 'rb')
    inVolume = loadRawVolume(fpInfile)
    print(inVolume.size)
    # convert numpy to text
    vtext = convertNumpyToText(inVolume)
    print(len(vtext))
    vtket = generateVtiTree()
#    ET.dump(vtket)
    setDataarray(vtket,vtext)
    setSize(vtket,width,height,slice)
#    ET.dump(vtket)
    etree = ET.ElementTree(vtket)
    etree.write(pathOutfile)
if __name__ == '__main__':
    args = sys.argv
    if len(args) == 6:
        pathInfile = args[1]
        pathOutfile = args[2]
        argsWidth = args[3]
        argsHeight = args[4]
        argsSlice = args[5]
        run(pathInfile,pathOutfile,int(argsWidth),int(argsHeight),int(argsSlice))
    else:
        print('Usage: python3 raw2vtitxt.py <infile> <outfile> <width> <height> <slice>')
        quit()
参考
XMLベースのvtk形式に関する覚書
https://qiita.com/hsimyu/items/a8fba8866c5f5c2d8b78




