演習の第2段階は,画像の白黒を反転するプログラムでしたが, こんどは画像のコントラストを変換する手法を取り扱います.
一般に医用画像は,画像のダイナミックレンジが広く,コンピュータが表示できる よりも多くの情報量を持っています. したがって,その中から必要な領域のみを取り出すことは大変重要です.
CT画像においてはCT値を表示用の濃淡に変換するために,ウィンドウ処理を 行いますが,これは,まさに階調処理と同じです.
ここでは,
基本的な流れは,今までと同じですが,階調処理用の関数として
win_proc(...)
として,用意しました.
また,main.cの中にこれ以上関数を書くと読みにくくなるので,別のファイル(winproc.c)に関数を書くことにしました.
コンパイルには,今までは,gcc main.cで良かったのですが,今回はgcc main.c winproc.cと2つファイル名を書く必要があります.
この間数が,mainの中から呼ばれ,階調処理を行います.
階調処理のパラメタは,この関数の中で設定されており,scanfを使って,キーボードから入力するようにしてあります.
基本的な流れは,前と同じです.変更点は,入力がunsigned char型ではなく,unsigned short型になっている点です. 出力は8ビット画像なのでunsigned char型です.
入力が10ビットの画像(chest.raw)で,そのままだと1024階調の濃淡を表現する必要がありますが,
普通は256色程度の濃淡しか表示されないため,その階調数に変換する必要があります.
そして,できることなら,必要な部分のコントラストが付くようにwindow level, widthを指定してあげることが可能になります.
そのためのプログラムは次のようになります.
main.cはこちら
winproc.cはこちら
Makefileはこちら.
ただし,コピーして使っても動きません.タブ,スペースが区別されるからです.
さらに,ここでは,便利なコンパイル方法を習得しましょう.
Unix環境ではMakefileというファイルにソースファイルや
ライブラリのオプションなどを書いておくと,gcc -o proc main.c winproc.cと打つ代わりに,
make
と入力するだけで自動的にコンパイルしてくれます.
これは,小規模なプログラム開発ではあまり効果はないように思えますが,大規模なプログラムを構築する場合には
(コンパイルに30分かかるフリーウェアプログラムも結構あります),
修正を行ったソースだけコンパイルすることができたりと便利な事が多々あります.
基本的な流れは,前と同じです.変更点は,入力がunsigned short型ではなく,short型になっている点です. 出力は8ビット画像なのでunsigned char型です.
今度は,入力が16ビットの画像(ct.raw)で,符号(プラスマイナス)があります.
やはり,これも普通では256色程度の濃淡しか表示されないため,その階調数に変換する必要があります.
そして,できることなら,必要な部分のコントラストが付くようにwindow level, widthを指定してあげることが可能になります.
そのためのプログラムは次のようになります.
main.cはこちら
winproc.cはこちら
Makefileはこちら.
ただし,コピーして使っても動きません.タブ,スペースが区別されるからです.
ここでも,コンパイルにはMakefileを活用しましょう.
次の演習では,畳み込みという処理を使った例を扱ってみましょう.