DICOM ファイルを TIFF に変換

2017-10-16 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-10-13)の記事「MRIConvert 使って DICOM から TIFF に変換」では、
  ・・・・・
  ・・・・・
  .dcmファイルを入力して、
  .niiファイル経由で、
  16bit .tifファイルに変換する。

  条件としては:
  ・・・・・
  ・・・・・
  ・・・・・

と云うことで、一応のモノが出来た。

だが、
先月(2017-09-13)の記事「DICOM 学習:ファイル読み込み
で書いたコードを流用すれば、.niiファイル経由もイラナイ?

と云うことで、作ってみた:
----- DICOM_to_TIFF.gsl -----
require'pl'; require'cv2_a'; SF = string.format
int16 = |x| ffi.cast( 'int16_t*', x )
uint16 = |x| ffi.cast( 'uint16_t*', x )
uint32 = |x| ffi.cast( 'uint32_t*', x )

ReadUInt16 = || uint16( IN:read(2) )[0]
ReadUInt32 = || uint32( IN:read(4) )[0]
ReadChars = |n| IN:read(n)

Fname = 'x.dcm'; IN = io.open( Fname, 'rb' ) -- サンプルデータ --

-- 先頭 128 バイトは Preamble ( all ゼロ )
-- 次の4バイトは:'DICM'

zzz = IN:read(128); fid = IN:read(4)
if fid ~= 'DICM' then
print( 'Not a DICM' ); _=io.read(1); os.exit()
end

------------------ 参考サイトの C# コードから・・・
g = ReadUInt16()
while g == 2 do
e = ReadUInt16();
vr = ReadChars(2)
if vr == 'AE' or vr == 'AS' or vr == 'AT' or vr == 'CS' or
vr == 'DA' or vr == 'DS' or vr == 'DT' or vr == 'FL' or
vr == 'FD' or vr == 'IS' or vr == 'LO' or vr == 'PN' or
vr == 'SH' or vr == 'SL' or vr == 'SS' or vr == 'ST' or
vr == 'TM' or vr == 'UI' or vr == 'UL' or vr == 'US'
then
length = ReadUInt16()
else -- Read the reserved byte
_ = ReadUInt16()
length = ReadUInt32()
end
----- print( g, e, vr, length, SF('%X',IN:seek()) ) -- デバッグ用
val = ReadChars(length)
g = ReadUInt16()
end

------------------- 以下部分を追加/流用

while g==8 or g==16 or g==24 or g==32 or g==40 or g==64 or g==28677 do
e = ReadUInt16();
length = ReadUInt32()
----- print( g, e, vr, length, SF('%X',IN:seek()) ) -- デバッグ用
val = ReadChars(length)

----------------
if g==40 then
if e==0x0010 then xx = uint16(val)[0] end
if e==0x0011 then yy = uint16(val)[0] end
if e==0x0100 then bpp= uint16(val)[0] end
end
----------------

g = ReadUInt16()
end

IN:close()

if bpp ~= 16 then print( 'Not 16bits' ); _=io.read(1); os.exit() end

-----------------------------------------------
_=path.currentdir() -- 'pl' で 'lfs' を使う為の準備
SZ = lfs.attributes( Fname, 'size' ) -- ファイルサイズ

IN = io.open( Fname, 'rb' )
zzz = IN:read( SZ - xx*yy*2 )
AT = uint16( IN:read('*a') ) -- Read xx*yy*2
IN:close()

require'cv2_a'
tif = cv2.cvCreateMat( yy, xx, CV_16UC1 )
BT = ffi.cast( 'uint16_t*', tif.Byte )

for n=0,xx*yy-1 do
BT[n] = AT[n] + 0x8000 ------------------
end

if string.find( Fname, 'dcm' ) ~= nil then
FN = string.gsub( Fname, '.dcm', '.tif' )
else
FN = Fname..'.tif'
end
cv2.cvSaveImage( 'o-'..FN , tif, 0 )
これで、・・・・・

これで、
.dcmファイルを 16 bit TIFFファイルに変換。
そこそこ汎用で???


本日はここまで。


DICOM 学習は続く?


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170822,1005
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク