情報処理演習 1回目:プログラミング入門 - gifu university情報処理演習...

16
情報処理演習 1回目:プログラミング入門 目的:C言語プログラム環境に慣れる 1.ソースファイル/コンパイル/実行/デバッグ,コメント行の理解 2.簡単なプログラムの実行:printf文(表示),for文(繰り返し) 3.変数の種類:実数型 か 整数型 (スカラー) 4.関数(関数の呼び出し.数学で使った三角関数の利用) (演習) 演習1ー1.プログラミングの流れを理解しましょう(講義で説明) ソースファイル: プログラム本体のこと.文字(テキスト)ファイル コンパイル: ソースファイルをコンピュータで実行できる形式に変換 実行: コンパイルした結果を実行する デバッグ: プログラム中のバグをとる 演習1ー2.次のプログラムを入力して,コンパイル,実行,デバッグしてください. 入力:アプリケーション:miエディタ を使います. main.cとして,ファイルを保存します(これがソースファイル) ターミナルを開いて作業します. コンパイル:gcc main.c 実行:./a.out デバッグ:ソースファイルを直して,コンパイル,実行 #include <stdio.h> #include <stdlib.h> int main(void) { printf(“Nagoya University\n”); return 0; } 演習1ー3.次のプログラムを入力して,実行しなさい.main2.cとして保存. #include <stdio.h> #include <stdlib.h> #include <math.h>

Upload: others

Post on 11-Aug-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 1回目:プログラミング入門目的:C言語プログラム環境に慣れる1.ソースファイル/コンパイル/実行/デバッグ,コメント行の理解2.簡単なプログラムの実行:printf文(表示),for文(繰り返し)3.変数の種類:実数型 か 整数型 (スカラー)4.関数(関数の呼び出し.数学で使った三角関数の利用)

(演習)演習1ー1.プログラミングの流れを理解しましょう(講義で説明) ソースファイル: プログラム本体のこと.文字(テキスト)ファイル コンパイル: ソースファイルをコンピュータで実行できる形式に変換 実行: コンパイルした結果を実行する デバッグ: プログラム中のバグをとる

演習1ー2.次のプログラムを入力して,コンパイル,実行,デバッグしてください. 入力:アプリケーション:miエディタ を使います. main.cとして,ファイルを保存します(これがソースファイル) ターミナルを開いて作業します. コンパイル:gcc main.c 実行:./a.out デバッグ:ソースファイルを直して,コンパイル,実行

#include <stdio.h> #include <stdlib.h> int main(void) { printf(“Nagoya University\n”); return 0; }

演習1ー3.次のプログラムを入力して,実行しなさい.main2.cとして保存. #include <stdio.h> #include <stdlib.h> #include <math.h>

Page 2: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

int main(void) { int i; //整数の値を保存する変数 i double x, y; //実数の値を保存する変数 x, y for(i=0;i<100;i++){ //繰り返しの指定.iが0から100になるまで x = sin((double) i / 10.0); y = cos((double) i / 20.0); printf(“(i, x, y) = %d, %lf, %lf\n”, i, x, y); //書式指定で結果の表示:%d:整数を表示.%lf:実数を表示. } return 0; }

演習1ー4.次のプログラムを入力して実行しなさい.main3.cとして保存. #include <stdio.h> #include <stdlib.h> #include <math.h> double waves(int n); //プロトタイプ宣言 関数の引数(ひきすう)明示 int main(void) { int i; double y; for(i=0;i<100;i++){ //iが0から100になる前まで,iが1ずつ増える y = waves(i); //そのiを関数waveに渡し,結果がyに保存 printf(“(i, y) = (%d, %lf)\n”, i, y); //結果表示 } return 0; }

double waves(int n) //double型の関数 結果が実数値で返す { double tmp; //内部変数の宣言 tmp = sin((double) n / 10.0) + cos((double) n / 20.0); //値の計算: sin, cosは数学の関数.実数を渡す return tmp; //保存された結果を返す }

Page 3: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 2回目:プログラミング入門目的:関数を使う for文 と if文 を使う1.変数のスコープ(有効範囲)を理解する:ローカル変数/グローバル変数2.関数化の利点を理解する:引数(ひきすう),返り値(かえりち).&と*3.if 文 と for文

(演習)演習2ー1.関数を理解しましょう(講義で説明+α)(メリット) 引数(ひきすう)によって処理をモジュール化できる 機能ごとに分割できるので,処理を理解しやすく,修正が簡単. 処理をブラックボックス化できる(ディメリット) 関数の名前を覚える必要があり,また,予約語との重複がないように確認が必要 変数の参照範囲(スコープ)に注意が必要:ローカル変数/グローバル変数(方法) アドレス渡し 渡す変数(実引数)の場所(アドレス)を教える. 従って,その渡した変数の値を書き換えることができる. 値渡し 渡す変数(実引数)の値のみを見せる. 値が見えるだけなので,その値を書き換えることは無理.(変数のアドレス表示) 値を保存するとメモリを使う.変数名に&をつける.(アドレスに保存された値の表示) アドレスに*をつける.(プロトタイプ宣言) 使う関数をプログラムの先頭部分にあらかじめ書く.以下のプログラムを実行しましょう:&と*の役割の理解#include <stdio.h>#include <stdlib.h>int main(void){ int i, j; //整数型の値を覚える変数. i=100; j=200; //i, jに仮の値を入れる printf("%d, %d, %p, %p\n", i, j, &i, &j); //%dは数字,%pはアドレスの表示 printf("%d, %d\n", *(&i), *(&j)); //アドレス:&の値:* を%dで表示 return 0;}

1

Page 4: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

演習2ー2.次のプログラムを入力して実行しなさい.main2-2.cとして保存.#include <stdio.h>#include <stdlib.h>#include <time.h>void _set_rand(int *x1, int *x2); //関数のプトロタイプ宣言int main(){ int i, j; //整数のスカラーを保存 _set_rand(&i, &j); //関数を呼び出して,i, j に値を保存する.アドレス渡し printf("(i, j)=(%d, %d)\n", i, j); //i, jの値を表示 return 0;}

void _set_rand(int *x1, int *x2) //乱数を使って値を設定する関数//アドレスを受け取る.*x1, *x2はint型の値を記録する場所を覚える変数{ //先頭のvoidは,この関数は値を持たない(空=void)の意味.x1, x2は仮引数. srand((unsigned)time(NULL)); //乱数のシードを現在時刻で設定 *x1 = rand(); //仮引数に乱数を設定. *x2 = rand(); //x1, x2のアドレスに保存された値を書き換える}

演習2ー3.次のプログラムを入力して実行しなさい.main2-3.cとして保存.#include <stdio.h> //追加された行は////のコメント#include <stdlib.h>#include <time.h>void _set_rand(int *x1, int *x2); //関数のプトロタイプ宣言void _set_max(int x1, int x2); ////int max; ////最大値を保存.グローバル変数 スコープは全体int main(){ int i, j; //整数のスカラーを保存.ローカル変数. _set_rand(&i, &j); //関数を呼び出して,i, j に値を保存する.アドレス渡し _set_max(i, j); //i, jのうち,大きい方をmaxに保存.値渡し printf("(i, j)=(%d, %d), max = %d, \n", i, j, max); ////i, j, maxの値を表示 return 0;}

2

Page 5: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

void _set_rand(int *x1, int *x2) //乱数を使って値を設定する関数.{ //先頭のvoidは,この関数は値を持たない(空=void)の意味.x1, x2は仮引数. srand((unsigned)time(NULL)); //乱数のシードを現在時刻で設定 *x1 = rand(); //仮引数に乱数を設定. *x2 = rand(); //rand()も関数.}

void _set_max(int x1, int x2){ if(x1>=x2){ max = x1; //maxはグローバル変数なのでどこからでも見れる } //しかも,その値を書き換えることもできる else{ max = x2; }}

演習2ー4.次のプログラムを入力して実行しなさい.main2-4.cとして保存.#include <stdio.h> //0から1000までの値をすべて足すプログラム#include <stdlib.h>int main(){ int i,sum; //加算する数値 i と和を保存する変数sum sum = 0; //足し始める前にsumに0を代入して初期か for(i=0;i<=1000;i++){ //iが0から1000までiを1ずつ増やす(i++) sum += i; //iの値をsumに加算する(+=) } printf("sum = %d\n", sum); //加算後にsumを表示 return 0;}

演習2ー5.次のプログラムを入力して実行しなさい.main2-5.cとして保存.#include <stdio.h>#include <stdlib.h>void _set_drand(double *x1, double *x2); //実数型の変数に乱数を設定

3

Page 6: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

int _determine(double x1, double x2); //円の内部にあるかどうか判定int main(){ int i, n, hit; double x, y; n=10000; hit = 0; //繰り返し回数:n と 円の中にあった回数hitの初期化 for(i=0;i<n;i++){ _set_drand(&x, &y); //乱数を発生させて(x, y)を決めて hit += _determine(x, y); //それが中心(0.5, 0.5),半径0.5の円内か? } //判定して内部にあれば,hitに1を加算 printf("Pi byMonteCarlo=%lf (n=%d)\n",(double)hit/(double)n/(0.5*0.5), n); //円の面積は円の内部に入った確率.従ってS=r^2PiよりPi = S/r^2. return 0;}

void _set_drand(double *x1, double *x2){ *x1 = (double)rand()/(RAND_MAX+1.0); //乱数の最大値RAND_MAX *x2 = (double)rand()/(RAND_MAX+1.0); //で値を割って[0.0, 1.0]にする}

int _determine(double x1, double x2){ if( (x1-0.5)*(x1-0.5)+(x2-0.5)*(x2-0.5) <= 0.5 * 0.5){ //条件判定 return 1; } else{ return 0; }}

宿題:演習2-5について以下の課題に取り組みなさい.(1) n=10, 100, 1000, 10000, 100000, 1000000のときの円周率を求めなさい.(2) 設定した(x, y)の平均位置も計算して表示するプログラムに修正しなさい. (予想は(0.5, 0.5)になる)

4

Page 7: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 3回目:プログラミング入門目的:配列を使う:スカラーからベクトルへ1.配列,アドレス,ポインタ2.大きさが固定の配列と可変の配列3.配列と関数

(演習)演習3ー1.アドレスを覚える方法:ポインタ 現実の世界の中で,物を管理する場合には,「モノそのものを管理する」場合と「場所を管理する」場合がある.駐車場を考えよう.駐車場の管理人は,ほとんどの場合,「車を置く場所」を管理する.駐車する人は「車そのものを管理する」. モノ=数値とする同様の仕組みがC言語の中にも存在する.すなわち,値を保存する場所(アドレス)を管理する場合と,値そのものを管理する場合がある.(理由)値が簡単なスカラーではなく,大規模データならば,値を管理するより,その場所を管理する方がよい(駐車場の話と同じ).

「*」の3つの役割:  かけ算. ポインタ型の宣言. 間接参照演算子.

以下のプログラムを実行して,結果を確認しなさい.

#include <stdio.h>#include <stdlib.h>int main(){ int i; //整数型の値を覚える変数 i  そのアドレスは &i

int *a; //整数型の値が保存できる場所を覚える変数 a アドレスは &a

i=100; a = &i; //aはアドレスを覚えるので,iのアドレスを代入

printf("%d, %d\n", i, *a);//iとaに保存されたアドレスを表示 printf("%p, %p, %p\n", &i, a, &a); //iのアドレス,aに保存されたiのアドレス,aのアドレスを表示}

1

Page 8: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

演習3ー2.配列を理解しましょう 画像データなどの大きな容量のデータは配列で表します. 配列はコンピュータのメモリを消費します.配列は,先頭アドレスと使う容量で表現します.例えば,駐車場で10台車をとめるときに,3番のエリアから10個使ってとめてください.と指示するのに似ています(10個連続して確保できるかどうかは別問題).(メリット) 数字をまとめて表すことができる:スカラーからベクトル/行列(ディメリット) 手続きが少し複雑.(方法) 大きさが固定 あらかじめ容量が分かっている場合に使う.文字列など.

大きさが可変 実行してみないと大きさが分からない/大きさを調べるプロ グラムで大きさを決める場合.画像/音声データなど.

次のプログラムを入力して実行しなさい.main3-2.cとして保存.#include <stdio.h>#include <stdlib.h>

int main(){ int i,n,array[100];//要素数100の配列を宣言.コンパイル時に決まる n=100; //要素数を保存 array[n]はできない. printf("i,n=%d, %d\n", i,n); for(i=0;i<n;i++){ printf("array[%d]=%d\n", i, array[i]); //初期化していない値を表示 } //でたらめな数字が表示される return 0;}

演習3ー3.配列の要素を初期化する関数:initarrayを作りなさい.(答え)void initarray(int *a, int num){ int i; for(i=0; i<num; i++){ a[i]=0; }}

2

Page 9: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

演習3ー4.配列の動的確保:次のプログラムを実行しなさい.#include <stdio.h> #include <stdlib.h>int main(){ int i,n,*array; //要素数が可変の配列を宣言.実行時に確保される n=100; //確保する数を指定 array = (int *)malloc(n*sizeof(int));//整数型で要素数nの配列を確保 printf("i,n=%d, %d\n", i,n); for(i=0;i<n;i++){ printf("array[%d]=%d\n", i, array[i]);//初期化していない値を表示 } //でたらめな数字が表示される return 0;}

演習3ー5.配列の動的確保:実行時に大きさを指定#include <stdio.h> #include <stdlib.h>int main(int argc, char *argv[]){ int i,n,*array; //要素数が可変の配列を宣言.実行時に確保される n=atoi(argv[1]); //実行時の引数を入力 ./a.out 100 で実行 array = (int *)malloc(n*sizeof(int));//整数型で要素数nの配列を確保 printf("i,n=%d, %d\n", i,n); for(i=0;i<n;i++){ printf("array[%d]=%d\n", i, array[i]);//初期化していない値を表示 } //でたらめな数字が表示される return 0;}

演習3ー6.前の演習のプログラムにおいて,配列を確保したあとに,配列の値を初期化する関数を呼び,配列内の値を初期化しなさい.ただし,その関数は,3-3を参考に,初期化する値も引数として渡すこと.

3

Page 10: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 4回目:プログラミング入門目的:関数で配列の計算をする:大規模データの取り扱い1.「値渡し」と「アドレス渡し」による関数理解2.関数の戻り値

演習4ー1.配列の動的確保:実行時に大きさを指定 乱数で値を設定#include <stdio.h>#include <stdlib.h>#include <math.h>

void set_array(int *a, int n, int joyo);double getmean(int *a, int n);double getsd(int *a, int n);void showparams(double x1, double x2);

int main(int argc, char *argv[]){ int i, n, waru, *array; //n:発生個数 waru:割る値・この値以下の乱数発生 double mean, sd; //平均と標準偏差を保存する n = atoi(argv[1]); waru = atoi(argv[2]); array = (int *)malloc(n*sizeof(int));

set_array(array, n, waru); //arrayへ要素数n,最大:waru-1の乱数をセットする mean = getmean(array, n); //arrayの平均を求める sd = getsd(array, n); //arrayの標準偏差を求める showparams(mean, sd); //保存された値を表示する

return 0;}

void set_array(int *a, int n, int joyo){ int i; for(i=0;i<n;i++){ a[i] = rand() % joyo; //a % b は aをbで割った余り }}

1

Page 11: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

double getmean(int *a, int n){ int i; double tmp; tmp = 0.0; for(i=0;i<n;i++){ tmp += a[i]; } return tmp/(double)n;}

double getsd(int *a, int n){ int i; double tmp, ave; ave = getmean(a, n); tmp = 0.0; for(i=0;i<n;i++){ tmp += (a[i] - ave) * (a[i] - ave); } return sqrt(tmp/(double)n);}

void showparams(double x1, double x2){ printf("%lf, %lf\n", x1, x2);}

演習4ー2.ヒストグラムを表示する関数を作りましょう.ただし整数でよい.ヒント:配列に保存された値を配列の要素番号にする. histogram[array[i]] ++;

演習4ー3.中心極限定理を利用して正規分布に従う乱数を発生する関数を作りましょう 中心極限定理:  どんな分布に従っていても集めるとその平均値の分布は正規分布に従う. 複数の一様分布の平均を計算するように改造する. 発生させた値のヒストグラムを表示.

2

Page 12: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 5回目:プログラミング入門目的:画像データの取り扱い1.ディジタル画像の構造:画素,画素値,画素間隔,型(char, short)2.画像の左右反転/上下反転(画素値の保存順の理解)3.画像の濃度分解能4.画像の白黒反転

演習5ー1.ファイルのダウンロードhttp://www.fjt.info.gifu-u.ac.jp/~hara/x8view.zipをダウンロードしてprgフォルダー内に保存して展開してください.

演習5ー2.ダウンロードしたファイルのコンパイル% make でコンパイルできます.オプションがいろいろあるのでコンパイルするためのプログラムが作ってあります.コンパイル後のファイルは,「x8view」となります.

演習5ー3.画像表示プログラムの実行% ./x8view chest.raw 512 512 プログラムに,表示したい画像ファイル 横 縦の画素数を渡します.胸部X線画像が表示されます.画像中でクリックすると□と画素値/座標が表示されます.

演習5ー4.画素値が保存されている配列:imageの理解画像は2次元ですが,1次元の配列で保存されています.(x,y)座標にある画素値 f(x, y)は,横幅:w,縦:h画素の場合,先頭から y * w + x 番目になります.これを利用して,(1) 左右反転した画像を表示しましょう(2) 上下反転した画像を表示しましょう

演習5ー5.画像の濃度分解能chest.rawは8ビット(256階調)の白黒画像です.この画像を128階調,64階調,32階調,16階調,8階調,4階調,2階調で表示して違いを観察しましょう.階調数は,コマンドライン引数で与えること.

演習5ー6.画像の白黒反転yosemite.raw, shirakawa.rawを表示しましょう.白黒反転して表示されると思います.これを白黒反転して正しく表示できるプログラムにしなさい.

1

Page 13: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 6回目:画像処理入門目的:画像処理の基本,画像からの特徴抽出1.空間フィルターの原理2.ノイズを除去する   平滑化(演習6-2)3.画素値の傾きを調べる 一次微分(演習6-3)4.傾きの強さを調べる  二次微分(演習6-4)5.アンシャープマスクフィルターを作ろう(演習6-5)6.画素値の平均,標準偏差を求めましょう(演習6-6)

演習6ー1.ファイルのダウンロード,コンパイル,実行ダウンロード:http://www.fjt.info.gifu-u.ac.jp/~hara/x8view2.zipをダウンロードしてprgフォルダー内に保存して展開してください.コンパイル:% make でコンパイルできます.コンパイル後のファイルは,「x8view」となります.実行:  % ./x8view chest.raw 512 512 プログラムに,表示したい画像ファイル 横 縦の画素数を渡します.画像中でクリックすると□と画素値/座標が表示されます.「i」を押すと白黒反転,「s」を押すと平滑化されます.

演習6ー2.平滑化プログラムの改造(1) 元は3x3です.5x5,7x7の平滑化にしましょう.(2) 31x31の平滑化を実装しましょう.

演習6ー3.微分画像の表示(1) 微分カーネルを用いて縦方向の微分画像/横方向の微分画像を表示しましょう.    微分後の値で0が128になるように画素値に足し算してください.(2) 微分の強度画像を表示しましょう.

演習6ー4.2階微分画像の表示3x3のラプラシアンフィルタに基づいて,2階微分画像を表示しましょう.

演習6ー5.高周波強調画像の作成(1) 3x3のラプラシアンフィルタの出力に原画像を加算した画像を表示しましょう(2) アンシャープマスクフィルタを作りましょう

演習6ー6.画像の基本的な特徴(1) すべての画素値の平均値を求めましょう(2) すべての画素値の標準偏差を求めましょう

1

Page 14: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 7回目:画像処理入門目的:画像処理の実践 1.アンシャープマスク 線形フィルターのまとめ2.非線形フィルター 最大値/最小値/中央値フィルター3.フーリエ変換を利用した画像処理

演習7ー1.ファイルのダウンロードとコンパイル,実行http://www.fjt.info.gifu-u.ac.jp/~hara/x8view3.zipをダウンロードしてprgフォルダー内に保存して展開してください.% make でコンパイル% ./x8view chest.raw 512 512 で実行.「s」を押すと平滑化されます.

演習7ー2.アンシャープマスクを作りましょう(cを押すと7x7, k=2で実行)平滑化のサイズと強調係数を変更して,結果を比べなさい.手順(1) 画像を平滑化する(平滑化の大きさ)手順(2) 原画像と平滑化した結果から鮮鋭成分を作る手順(3) 鮮鋭成分を係数倍(強調係数)して原画像に加算して結果を得る

演習7ー3.非線形フィルターの作成・実行(smoothを改造する)(1) 最大値フィルター カーネルの範囲の最大値で中心を置き換える(2) 最小値フィルター カーネルの範囲の最小値で中心を置き換える(3) 中央値フィルター カーネルの範囲の中央値で中心を置き換える

演習7ー4.空間領域と空間周波数領域の変換:スペクトルとパワースペクトル(1) 画像を表示して「f」をおす(フーリエ変換)(2) パワースペクトルの画像(パワースペクトルのsqrtのlog)を観察する(3) 「F」をおしてもとに戻る(フーリエ逆変換)

演習7ー5.高周波成分の表示:通過する帯域を変えて結果を比べなさい(1) 画像を表示して「f」をおす(フーリエ変換)(2) 「1」を押してスペクトルの中心部分(低周波部分)を削除する(3) 「F」を押して逆変換

演習7ー6.低周波成分の表示:通過する帯域を変えて結果を比べなさい(1) 画像を表示して「f」をおす(フーリエ変換)(2) 「2」を押してスペクトルの周辺部分(高周波部分)を削除する(3) 「F」を押して逆変換

1

Page 15: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 8回目:画像認識入門目的:画像認識の基礎(古典的な手法の理解)1.セグメンテーション(Segmentation):対象を限定する2.モルフォロジ(Morphology):抽出した領域を整形する3.ラベリング(Labeling):領域に番号をつける4.特徴抽出(Feature extraction):領域ごとに特徴量を抽出する5.識別(Discrimination):特徴量に基づいて対象を識別する

演習8ー1.ファイルのダウンロードとコンパイル,実行http://www.fjt.info.gifu-u.ac.jp/~hara/x8view4.zipをダウンロードしてprgフォルダー内に保存して展開してください.% make でコンパイル % ./x8view chest.raw 512 512 で実行.他の画像も実行

演習8ー2.セグメンテーション 最も簡単な二値化を行います(1) キー「+/-」 で二値化するしきい値を変更して結果を確認しなさい.(2) キー「b」で,画像の平均値で二値化するように改造しなさい.(3) キー「B」で,大津の二値化の方法によって二値化しなさい.

演習8ー3.モルフォロジフィルタの実装:二値化後の処理(1) キー「d」と「e」でそれぞれダイレーション/エロージョンを実行しなさい.(2) キー「o」と「c」でオープニング/クロージングを実行しなさい.(3) オープニング/クロージングを複数回実行して,図形の変化を確認しなさい.

演習8ー4.ラベリング:8近傍の接続を探す(1) 二値化,モルフォロジを実行した後に「L」を押してラベリングを実行しなさい(2) 二値化,モルフォロジのパラメタを変更してラベリングの結果を比較しなさい

演習8ー5.特徴抽出:featureextraction.cで処理(1) 「E」を押した後に,ラベル毎の結果を確認しなさい    画素値の平均値,画素値の標準偏差,面積,重心座標(x,y),円形度(2) 二値化,モルフォロジのパラメタを変更してラベリングの結果を比較しなさい    また,抽出した特徴量の違いを確認しなさい.

演習8ー6.識別:elimination.c(1) 「D」を押した後の処理方法と,その結果を確認しなさい.(2) 対象の面積と円形度の特徴量を平面にプロットしなさい(エクセル)(3) 対象とノイズと分離できる線を探しなさい.(4) 特徴量が3つ以上になったときにどうするか,考えなさい.

1

Page 16: 情報処理演習 1回目:プログラミング入門 - Gifu University情報処理演習 2回目:プログラミング入門 目的:関数を使う for文 と if文 を使う

情報処理演習 9回目:コンピュータ支援診断システム目的:コンピュータ支援診断(Computer-aided diagnosis)の理解1.コンピュータが病変やそれに関連する部位を自動的に見つける2.読影者はコンピュータの結果を参考にしながら読影を行う3.最終的な診断は,読影者(人)が行う4.コンピュータは読影者の補助ツールとして存在する5.読影者の見落としや勘違いを削減するために利用できる

演習9ー1.ファイルのダウンロードとコンパイル,実行http://www.fjt.info.gifu-u.ac.jp/~hara/x8view5.zipをダウンロードしてprgフォルダー内に保存して展開してください.% make でコンパイル % ./x8view mdb023s.raw 512 512 で実行.

演習9ー2.病変部位の自動検出プログラムの実行(1) キー「P」でプログラムを実行しなさい.(2) ソースファイルを見て,自動検出プログラムの概要を理解しなさい.(3) 5つの異常症例の画像についてすべて実行しなさい.(4) 真陽性:True-positive(TP)と偽陽性:False-positive(FP)を理解しなさい

演習9ー3.異常部位の検出性能の把握(1) 5つの異常症例について,TPとFPの個数を表に記入しなさい.(2) 異常を異常として正しく検出した確率(真陽性率)を計算しなさい.

演習9ー4.正常部位の検出性能の把握(1) 5つの正常症例について,FPの個数を表に記入しなさい.(2) 正常を正常として正しく検出した確率(真陰性率)を計算しなさい.

演習9ー5.画像あたりの偽陽性数の把握(1) 10例すべてから画像あたりのFP数を計算しなさい.(2) FP数と真陽性率,FP数と真陰性率の関係について理解しなさい.

演習9ー6.Receiver Operating Characteristic曲線(1) 得られた真陽性率と真陰性率から,縦軸に真陽性率を,横軸に1ー真陰性率    (=偽陽性率)をプロットして,ROC曲線を作成しなさい.(2) ROC曲線下の面積(Area-under-the-curve: AUC)を求めなさい.

演習9ー7.総合演習(1) プログラムを改造して,より高いAUCとなるプログラムを構築しなさい.

1