第3回CADセミナー@岐阜 演習3/階調処理

演習の第2段階は,画像の白黒を反転するプログラムでしたが, こんどは画像のコントラストを変換する手法を取り扱います.

一般に医用画像は,画像のダイナミックレンジが広く,コンピュータが表示できる よりも多くの情報量を持っています. したがって,その中から必要な領域のみを取り出すことは大変重要です.

CT画像においてはCT値を表示用の濃淡に変換するために,ウィンドウ処理を 行いますが,これは,まさに階調処理と同じです.

ここでは,

を行うプログラムを作成し,処理結果の8ビット画像を得ることを目的とします. 表示系のプログラムは扱わず,前の演習同様,変換処理後に画像表示プログラムで表示します.


8bit画像の階調処理

基本的な流れは,今までと同じですが,階調処理用の関数として
win_proc(...)
として,用意しました.
また,main.cの中にこれ以上関数を書くと読みにくくなるので,別のファイル(winproc.c)に関数を書くことにしました. コンパイルには,今までは,gcc main.cで良かったのですが,今回はgcc main.c winproc.cと2つファイル名を書く必要があります.

この間数が,mainの中から呼ばれ,階調処理を行います.
階調処理のパラメタは,この関数の中で設定されており,scanfを使って,キーボードから入力するようにしてあります.

main.cはこちら
winproc.cはこちら


符号無し10ビット画像の処理:ディジタル化された胸部X線写真の処理

基本的な流れは,前と同じです.変更点は,入力が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分かかるフリーウェアプログラムも結構あります), 修正を行ったソースだけコンパイルすることができたりと便利な事が多々あります.


CT画像の処理:自由なウィンドウレベルとウィンドウ幅での処理

基本的な流れは,前と同じです.変更点は,入力がunsigned short型ではなく,short型になっている点です. 出力は8ビット画像なのでunsigned char型です.

今度は,入力が16ビットの画像(ct.raw)で,符号(プラスマイナス)があります. やはり,これも普通では256色程度の濃淡しか表示されないため,その階調数に変換する必要があります.
そして,できることなら,必要な部分のコントラストが付くようにwindow level, widthを指定してあげることが可能になります. そのためのプログラムは次のようになります.

main.cはこちら
winproc.cはこちら
Makefileはこちらただし,コピーして使っても動きません.タブ,スペースが区別されるからです.

ここでも,コンパイルにはMakefileを活用しましょう.


以上,画像の階調変換の例を示しました.まとめると, という演習を行いました.

ここまでできるようになると,画像中の画素値をかなり自由に操作しているといって良いでしょう.
そして,この演習では,階調を変えただけだったのですが,画像をぼかしたり鮮鋭にしたりと,欲が出てきませんか?

次の演習では,畳み込みという処理を使った例を扱ってみましょう.