2014年11月25日火曜日

DICOM



今回はかなり専門的な話です。

DICOMというものをご存知でしょうか。

たぶん、ほとんどの人は見る機会さえないので知らないと思いますが、医療用に用いられる画像形式(のようなもの)です。


例えば、レントゲンとかCT、MRIとかです。

昔はフィルムで撮影したものも技術の発展とともにデジタル化され、

今では撮影・撮像機械と病院内のコンピュータシステムが連携しています。

最近は都市部の病院は小さな開業医でも電子カルテを使っていたりして、急速に電子化が進んでいます。


DICOM形式はアメリカで開発されたもので、今では世界的な標準仕様になっています。

なぜ、普通のJPEGやPNGではだめなのかというと、医療用の画像には画像ピクセルそのものの情報だけではなく、撮影した状況、部位、患者情報、日付などが記されています。


仕事の関係でDICOMのヘッダ部分を分析する必要があったため
備忘録として簡単な導入部分をまとめてみました。
pythonはライブラリが豊富なので、DICOMライブラリも読み込むだけで使えます。


その前に、まずPIPでPydicomを インストールします。



$ pip install pydicom

例: 引数で与えるファイル名のDICOMファ イルを読み込み、患者IDなどの情報を表示するスクリプト


ファイル名:showDicomInfo.py


#!/usr/bin/env python

import sys,dicom

d = dicom.read_file( sys.argv[1] )
print d


実行例:


$ ./showDicomInfo.py example.dcm


患者IDのみを表示する場合、

#!/usr/bin/env python

import sys,dicom

d = dicom.read_file( sys.argv[1] )
print d.PatientID



ほかの値についてはdirメ ソッドで見てください。
つまり、上の例でいうと

print dir(d)

とすると
メソッド・メンバ変数の一覧が表示されます。


2014年11月10日月曜日

JSON文法チェック方法

データの送受信または記述のためよく使われるJSON(ジェイソン)という形式があります。
テキストなので、windowsなら標準で入っているメモ帳のようなテキストエディタで編集できます。

例えば、
{
   "name" : ["shimotomai", "takayuki"],
   "degree":"PhD"
}
こんな感じです。

入れ子構造にもでき、XML同様柔軟性が高い記述方式として最近よく使われています。

ただ、コンマ忘れやすいので、よく文法エラーになります。
もしくは最後の要素の後にコンマを入れたり、
コロンがなかったり、ダブルクォーテーションがシングルになっていたり。

ロボットの音声認識システムで、採用していたのでJSON形式よく利用していましたが、

記述が長いと、目で見てエラーをチェックするとか拷問に近いです。
あり得ません。

ということで、

自動的にチェックしてくれる方法をいくつか利用していました。
そのうちPythonを使って行う方法をご紹介します。
簡単です。

$ python -mjson.tool dummy.json



これだけです。
今回はプログラムさえ書きません。

エラーの場合

Expecting property name: line 12 column 2...
という風に行番号が表示されます。つまりこの場合は、12行目にエラーがありますよということです。


demjsonがインストールされていれば
jsonlint -v hoge.json
でもチェック可能です。

demjsonのインストールはubuntuの場合、
sudo aptitude install python-demjson
でできます。


pythonを使ったjson形式の取り扱いについてはそのうちまた詳しく書きます。




2014年11月8日土曜日

ラン ダム文字列生成

ご無沙汰しております。
最近仕事で、任意の長さのランダム文字列を生成するスクリプトを作りました。

CGIなどでセッション情報などをpythonで管理する場合、重複する可能性の低いランダムな文字列が必要になることがあります。

それで、英数字大小文字混合の26+26+10=62種類をまぜて任意の長さの文字列を作ります。
下のソースが作成したスクリプトです。

import string
import numpy
m=100
s = ''.join(numpy.random.choice( list( string.digits + string.letters ), m ))
print s


pythonはたくさんのライブラリがあって便利な反面、簡単なことをするにしても、ライブラリを複数読み込む必要があります。
今回もnumpyとstringを読み込んでいます。
numpyは以前も説明した通り、python標準ではありませんので、別にインストールする必要があります。

ポイントとしては
listで文字列をリストに変換しているところと、
numpy.random.choiceで配列要素から100個サンプリングしているところです。
string.lettersは'abcd.....'というようなすべての英数字を含んだ文字列が欲しかったので使いました。

もちろん、他の方法でもできますが、これが一番理解しやすくて簡潔だと思います。
是非使ってみてください。