核医学機器工学概論

北大病院 核医学診療科
加藤千恵次
chtgkato.com

chtgkato.com

本講義の目的
国家試験によく出題される画像のフーリエ変換処理、畳み込み積分処理、断層画像再構成（CT、PETなど）を理解する。
サンプルデータとプログラムを用いて解説する。

講義内容
１．C言語による簡単なプログラム作成法の習得。
２．画像を表示する方法の習得。
３．画像の実空間フィルタ処理法。
４．周波数空間処理。高速フーリエ変換（FFT）。
５．断層画像再構成法の理解。（CTの原理）
画像処理技術と平行してC言語文法を学習する。

無料のC言語作成プログラムをダウンロード。
Visual Studio express で検索し、このＨＰへ。

Visual Studio Express 2012 for Windows Desktopの ダウンロードページへ。

Visual Studio 2010 Express のVisual C++ 2010 Express ダウンロードページへ。

ダウンロード言語が日本語になっていることを確認し今すぐインストール を クリック。

実行ボタンを クリック。

セットアップ ダイアログ が現れる。次へ を クリック。

インストールには数十分かかる。インストール後に製品の登録を行う。
これを実施しないと、３０日後に使用できなくなる。

オンラインで登録キーを取得する。

Microsoft の アカウントを持っていない場合は新規登録を行う。 アカウントを作成したら登録アドレス、パスワードを入力。

Product key が 表示されるので、ドラッグしてコピーする。

Product key を 登録キーを入力するテキストボックス内にペーストする。

登録が完了。
Visual C++ が 無料で使える環境が整う。

プログラム作成に必要な Windows での作業。
「ファイル名の拡張子を表示する」 モードにする。

ファイルの拡張子が表示されないとファイルの区別がつかないファイルの拡張子が表示されるモード

Windows 7 の場合スタートボタン（画面左下の丸いウィンドウズマーク）をクリックして、左の画面を表示。
コンピュータ をクリック。

Windows 7 の場合スタートボタン（画面左下の丸いウィンドウズマーク）をクリックして、左の画面を表示。
コンピュータ をクリック。

フォルダ オプションダイアログが開く。
表示タグをクリック。

「登録されている拡張子は表示しない」のチェックをはずす。

ＯＫボタンをクリック。

さらに、ファイル表示を 詳細モード にするとプログラム作成に必要な ファイルを見つけやすい。

Windows ８ の場合キーボード または 画面左下の ウィンドウズボタンをクリックして、アプリの一覧画面を表示。
エクスプローラー をクリック。

エクスプローラー の 表示タグ をクリック。

詳細 を選択。 ファイル名拡張子にチェックを入れる。

画像描画プログラムの実行結果核医学画像ファイル bone が表示される。
（患者情報を削除した医用画像データファイルを用意。）

画像に 中央値フィルタ処理（median）を行うフィルタ処理プログラムを各自作成して、実際の医用画像で効果を確認する演習。
median filter は smoothing filter より輪郭が保たれる。
median filter は、微細なノイズを除去する効果がある。

画像を フーリエ変換（周波数変換）する演習。

Original Image

Frequency spectrum

FFT

Filtered Image

Frequency
space
filtering

FilteredFrequencyspectrum
実際の医用データをIFFT使った周波数空間フィルタの演習問題。

脳のポジトロンＣＴデータを用いてＣＴの原理を理解する演習。

どの言語を習得すればよいか
今までは UNIX、Ｌｉｎｕｘで動作する、標準的な文法のＣ言語、Ｃ++言語が主流であった。

現在では Windowsでの Visual C++、VisualC#、Visual BASIC およびJava などが主流であるが非常に癖のある言語が多く学習が困難。
基本となる言語は CまたはC++言語であるが、Windowsで文字と画像を標準的な文法で扱うC言語開発ツールを探すのは困難。

C や C++言語で主なOS （Windows、UNIXなど） が作られている。
すなわち現代社会で最も重要な言語である。
まず基本となる普通の CまたはC++言語の文法（ＡＮＳＩ規格）を知ることは、
将来 Visual C# や Visual C++ を使う必要が生じた場合にも必ず役立つ知識となる。
いきなり Microsoft が決めた文法に従ってCプログラムを作るのは大変苦労する。

Windows上で標準的なＣ言語を使って画像を扱うプログラムを作成する方法
OSはWindows XP、Vista、Seven（32 or 64bit）コンパイラ（プログラムから実行ファイル（.exeファイル）を作るソフトウェア）
Visual C++ 2010 Express （無料）
Visual Studio .Net （端末室のPCに入っている）

Visual C++ Express によるプログラムの作り方
ファイル ー 新規作成 － プロジェクト を選択。

新しいプロジェクト のダイアログが現れる。

Win32を選択

Win32プロジェクトを選択

参照ボタンを押して、プロジェクトを保存するディレクトリを作成。
任意のプロジェクト名（プログラム名）を入力して ＯＫ をクリック。
（とりあえずデスクトップに program0 フォルダを作成）

ソリューションのディレクトリを作成 のチェックを外す。

Win32アプリケーションウィザード のダイアログが現れる。
次へ を左クリック。

Windowsアプリケーション を選択。

空のプロジェクト にチェックを入れる。
（これが重要）メイン画面に program0 プロジェクト が現れる。

program0 を右クリック。

プロパティをクリック。

文字セット － マルチバイト文字セットを使用 を選択。
（これを行わないと日本語仕様のWindowsでは、作成したプログラムで文字化けが生じる）

C言語プログラムの記述。
ソースファイルを右クリック。

追加 － 新しい項目 を選択。

新しい項目の追加 のダイアログが現れる。

C++ファイル を選択
プログラムのファイル名を入力（プロジェクト名と同じ名前にすると混乱しにくい）拡張子を .c にする。 （ここでは program0.c ）拡張子 .c は、Ｃ言語プログラム コード を示す。

program0.c ファイルが作成される。

この空白に program0.cのプログラムコードを記述する。

Ｃ言語の記述。 画面に Hello, C language. を表示する

// program0.c#include <stdio.h>#include <HU.h>void Main(void){
TextWindow( 100, 100, 400, 300 );printf(" Hello, C language. ");}

// Program0.cとは、ただの注釈文。プログラムではない。
//（ダブルスラッシュ）を書くと、そこから右側の文字はプログラムから無視される。
（rem文という）
Ｃコンパイラは、rem文を緑色で表示する。
注釈文を適宜プログラムに入れることで、プログラムを理解しやすくなることが多い。
日本語もOK.

#include < > とは、プログラムにヘッダファイルを合体させることを示す。Ｃコンパイラでは青色で表示される。
#include <stdio.h> 通常のC言語の最初の文。
C言語が、キーボード、マウス、ディスプレイなどの、コンピュータの基本入出力装置を使えるように、あらかじめMicrosoftが用意してくれたプログラム（ヘッダファイル）を合体させることを示す。
stdio.h = Standard Input Output headerヘッダファイル
関数の実体（中身）を記述したファイル。
例えば、画面に文字を表示するウィンドウを作成するだけでも多くのWindowsを操作する関数を使って複雑なプログラムを記述する必要が生じるが、その過程を１つの関数ＴｅｘｔWindow（）で済むように あらかじめ面倒なプログラムが既に書き込まれているファイル。

ヘッダファイル HU.h#include < HU.h >Visual Studio .net 等の C言語でウィンドウや文字、画像の表示を行うには、ものすごく面倒な関数を使わなくてはならない。
そこで、面倒な関数によるプログラムを既に書いてあるヘッダファイルが HU.h#include < HU.h > と書くことで面倒な関数の記述がすでに完了したことになり、プログラム作成作業が大幅に簡略化される。

#include < > とは、
Visual C++ のヘッダファイルフォルダ内
Ｃ： - Program Files(x86)- Microsoft Visual Studio 10.0
– VC – includeの中から、ヘッダファイルを探して、プログラムに合体させることを示す。
HU.h を、上記フォルダ内に コピーしておく。

ホームページから HU.h HU.h 説明書 をダウンロード。

ファイル名を右クリックして対象をファイルに保存 を選択。

void Main(void){}とは、普通のC言語では main( ) と書くが、Main(void)と書くことで、HU.h に用意した関数が使えるようになっている。
void とは、空っぽ の意味。

関数だから、何かを入力して、何かを出力するのだが、 メイン関数は、何もしない形式上の関数なので、main の右側のカッコ内に、本当は入力する変数を入れるところにvoidを記述する。
何も出力しないことを示すために mainの左側にも void と記述している。
void Main(void){}の ｛ と ｝の間にC言語プログラムを書く。

TextWindow(100, 100, 400, 300);とは、HU.h で定義した、文字表示用ウィンドウ（テキストウィンドウ）作成関数。
このウィンドウの中には画像は描けない。
(100, 100, 400, 300) は、テキストウィンドウの位置、大きさ。
左の 100, 100 はウィンドウの左上座標。
次の 400, 300 はウィンドウの右下座標。

TextWindow(100, 100, 400, 300) ;の、右端の；（セミコロン）は、C言語プログラム文の区切りを示す。
文の終わりには必ず ; を打つ。
; の打ち忘れは、最もよくあるC言語プログラムミス（バグ）。

printf（“Hello, C language.”）;printf（） は、文字や数字をテキストウィンドウに表示する関数で、C言語で頻繁に使う関数。
記述したい文字を、カッコの中に “ 文字 ” と記述する。
（“”で挟んだ文字列を、文字列リテラル という。）
日本語などの２バイト文字もOK.
TextWindow(100,100,400,300); とprintf(“Hello, C language.”); を １行につないでTextWindow(100,100,400,300); printf("Hello, C language.");と記述しても同じ。
セミコロンで文の終点が明示してあれば全く同じプログラムとして正常に動く。

program0 の実行

緑三角のデバッグボタンをクリック

program0 の実行結果
X ボタンをクリック
するとプログラム終了

TextWindow関数がprintf関数が設定した作成したウィンドウ

文字列の表示program0 フォルダ内に Debug フォルダが作成され、program0.exe が完成した実行プログラム。
これをクリックすると同じ実行結果を得る。

詳細表示にするエクスプローラで拡張子（.exe など）が表示されない場合
は、エクスプローラのフォルダオプションで「拡張子は表示しない」のメニューのcheck をはずす。

program0 フォルダ内にプロジェクトファイルprogram0.vcproj ファイルが作成される。
これをクリックすると Visual C++ が起動し、プログラムの編集作業が可能となる。

端末室のＰＣでprogram1 を実行する場合は、program1 のプロジェクトフォルダ内にヘッダファイル HU.h をコピーして、#include <HU.h> と記述されている部分を#include “HU.h” と修正する。
プロジェクトフォルダ内のヘッダファイルの読み込みは、#include < > ではなく#include “ ” と記述しないと読み込まない。

新たなプロジェクトフォルダを作るたびに、その中にヘッダファイルHU.ｈをコピーするのが面倒な場合は、C:¥Program Files ¥ Microsoft Visual Studio 9.0 ¥ VC
¥ include の フォルダ内に、 HU.ｈをコピーすると、#include <HU.h> でOK。

試しに、わざとバグ（誤り）を入れてみる。
printf() 関数を、print() と変更してコンパイルする。
下のウィンドウにビルドログが現れ、エラーを指摘する。
エラー文をダブルクリックするとバグを含む文に印が付く。

ウィンドウタイトル表示// Program1.c#include <HU.h>void Main(void){
TextWindow(0,0,300,200);
Title("Program1");
printf("Hello, C. But I hate C.");}改行文字 ¥n// Program1.c#include <HU.h>void Main(void){
TextWindow(0,0,300,200);
Title("Program1");
printf("Hello, C. ¥nBut I hate C.");}改行文字 ¥n// Program1.c#include <HU.h>void Main(void){
TextWindow(0,0,300,200);
Title("Program1");
printf(“¥nHello, C. ¥n¥n¥nBut I hate C.");}空白文字// Program1.c#include <HU.h>void Main(void){TextWindow(0,0,300,200);
Title(“Program1”);
printf(“¥n Hello, C. ¥n¥n¥n But I hate C.");}Title(“ ”) や printf（“”） などの “ と ” に挟まれた文字列を、文字列リテラルという。
文字列リテラルには日本語などの２バイト文字もOK.
日本語を使ったときの注意点。 全角空白文字の恐怖。
日本語入力（全角文字入力）モードの状態で、日本語を入れてはいけないところに空白文字を入れると、普通の半角スペースとは異なる文字なので、プログラムはエラーになります。
空白なので目で見ても間違いは見つかりません。
とても発見が困難なバグになります。
（バグ : bug = プログラム記述ミス）

以上の理由で、プログラム中は日本語を使わない方が無難。