DICOM 学習:ファイル読み込み

2017-09-13 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-09-11)の記事「DICOM 学習:初め?」で書いた、
c#: how to read parts of a file? (DICOM)」の
回答 11 のコードを真似て
何とか読み込みできるものを作った:
----- DICOM_Read.gsl -----
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)

IN = io.open( 'x.dcm', '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== 16 then print( uint16(val)[0], '=xx' ) end -- 512
if e== 17 then print( uint16(val)[0], '=yy' ) end -- 512
if e==256 then print( uint16(val)[0], '=bpp' ) end -- 16
if e==257 then print( uint16(val)[0], '=msb' ) end -- 16
if e==258 then print( uint16(val)[0], '=hib' ) end -- 15
end
--------------------

g = ReadUInt16()
end


val = ReadChars(6) ----- この6バイト分は不明?

----------
print( SF('%X',IN:seek()) ) ----- 0x09A2 = 2466

----------
val = IN:read(512*512*2)
D = int16( val )

Mx, Mn = 0, 256*256
for n=0,512*512-1 do v=D[n]
if v>Mx then Mx=v end
if vend

print( Mx, Mn ) ----- 1965, -2048
これで、・・・・・


これで、.dcmファイルを読み込める???
そこそこ汎用で???


補足:
  値データは、符号付き16ビット?
  「DICOM ファイルからのイメージ データの読み取り

  .dcm ファイルのデフォルトは、リトルエンディアン?
  「DICOMファイルフォーマットの概要
  タグからは、エンディアンの判定は不能?



本日はここまで。


DICOM 学習は続く。


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


170817
関連記事
スポンサーサイト

コメントの投稿

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

おきてがみ/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
ブックマーク