画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

Similar documents
情報処理演習 B8クラス

PowerPoint プレゼンテーション

memo

PowerPoint Presentation

Microsoft Word - Cプログラミング演習(10)

PowerPoint Presentation

Microsoft PowerPoint - kougi2.ppt

Taro-ファイル処理(公開版).jtd

PowerPoint Presentation

Microsoft Word - no15.docx

ファイル入出力

Microsoft PowerPoint - kougi4.ppt

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

cp-7. 配列

Microsoft Word - Cプログラミング演習(12)

C言語講座 ~ファイル入出力編~

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Java講座

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

Cプログラミング1(再) 第2回

Microsoft PowerPoint - CproNt02.ppt [互換モード]

Microsoft PowerPoint - handout09.ppt

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

プログラミング実習I

Microsoft PowerPoint - lec10.ppt

プログラミング基礎

第9回 配列(array)型の変数

PowerPoint プレゼンテーション

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

02: 変数と標準入出力

プログラミング基礎

Taro-2分探索木Ⅰ(公開版).jtd

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

Microsoft PowerPoint - 14th.ppt [互換モード]

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>


PowerPoint プレゼンテーション

3-4 switch 文 switch 文は 単一の式の値によって実行する内容を決める ( 変える ) 時に用いる 例えば if 文を使って次のようなプログラムを作ったとする /* 3 で割った余りを求める */ #include <stdio.h> main() { int a, b; } pri

Microsoft PowerPoint - C言語の復習(配布用).ppt [互換モード]

スライド 1

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Transcription:

第 14 回 応用 情報処理演習 ( テキスト : 第 10 章 )

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

特定色の画素の検出 ( テキスト 134 ページ ) 画像データが保存されているファイルを読み込んで, 特定色の画素の位置を検出するプログラムを作成しなさい 元画像生成画像 ( 結果の画像 ) 赤色ピクセルの検出 元画像で赤色の画素だけ黒にし, それ以外の画素は白にした画像を生成する

特定色の画素の検出 画像は平面上に配置された画素の集まり 二次元配列に画像データを入れる 配列の各要素に対して同様の処理を施す場合, 繰り返しを使ったプログラムを記述する 二次元配列を扱うので, 二重ループを作成する ある画素の色が特定色であれば, 見つけたときの処理, そう出なければ, 見つけなかったときの処理を実行するので, 条件分岐を使う ピクセルの値 ( 配列に入っている値 ) で判断する

プログラムの流れ ( テキスト 136 ページ ) 1. 定数の定義 2. 各種変数, 配列の宣言 3. ファイルから画像データを読み込む 4. 赤色画素の検出, 結果の画像の生成 ( ループ ) 5. ファイルへ結果画像の書き出し

画素の値で処理を変える if ((R >= 200) && (G <= 50) && (B <= 50)) { 赤い画素 の処理( 見つけたときの処理 ) } else { 赤い画素でない の処理 } // ただし R,G,B は画素の各色の画素値を示す 赤色は RGB でどういう値になるのか? R >= 200 G <= 50 B <= 50 このようにしてみる

すべての画素で処理を行う for (i = 0; i < height; i++) { } for (j = 0; j < width; j++) { } if ((R >= 200) && (G <= 50) && (B <= 50)) { } else { } 赤い画素 の処理 ( 見つけたときの処理 ) 赤い画素でない の処理 すべての画素を対象に値のチェックを行う 二次元配列 二重ループ 画素の値で処理を変える

#include <stdio.h> 定数の定義と変数の宣言 int main (int argc, const char * argv[]) { const int MAX_WIDTH = 640; const int MAX_HEIGHT = 480; int width, height; /* 画像を入れる 2 次元配列の宣言 */ unsigned char SrcImageR[MAX_HEIGHT][MAX_WIDTH]; unsigned char SrcImageG[MAX_HEIGHT][MAX_WIDTH]; unsigned char SrcImageB[MAX_HEIGHT][MAX_WIDTH]; unsigned char ExImageR[MAX_HEIGHT][MAX_WIDTH]; unsigned char ExImageG[MAX_HEIGHT][MAX_WIDTH]; unsigned char ExImageB[MAX_HEIGHT][MAX_WIDTH]; const char InFileName[] = "ColorChars.ppm"; /* 入力ファイルの名前 */ const char OutFileName[] = "ExtRed.ppm"; /* 出力ファイルの名前 */ FILE *f; const int LEN = 100; char line[len]; int i, j;

/* ファイルからの読み込み */ データの読み込み f = fopen(infilename, "r"); if ( f == NULL ) { fprintf(stderr, " ファイル %s のオープンに失敗しました ", InFileName); return -1; } fgets(line, LEN, f); /* 1 行目は読み飛ばす */ fgets(line, LEN, f); while (line[0] == '#') { /* コメントは読み飛ばす */ fgets(line, LEN, f); } /* 画像の幅と高さ */ sscanf(line, "%d %d", &width, &height); fgets(line, LEN, f); /* データの3 行目は読み飛ばす */ for ( i = 0; i < height; i++ ) { for ( j = 0; j < width; j++) { fread( &(SrcImageR[i][j]), 1, 1, f); fread( &(SrcImageG[i][j]), 1, 1, f); fread( &(SrcImageB[i][j]), 1, 1, f); } } fclose(f);

条件を満たす画素の検出 for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { if ((SrcImageR[i][j] >= 200) && (SrcImageG[i][j] <= 50) && (SrcImageB[i][j] <= 50)) { ExImageR[i][j] = 0; ExImageG[i][j] = 0; ExImageB[i][j] = 0; 見つけたときの処理 } else { 画素を黒色にする ExImageR[i][j] = 255; ExImageG[i][j] = 255; ExImageB[i][j] = 255; } 画素を白色にする } }

ファイルへのデータの書き出し /* ファイルへの出力 */ f = fopen(outfilename, "w"); fprintf(f, "P6 n"); /* 1 行目 */ fprintf(f, "%d %d n", width, height); /* 2 行目 */ fprintf(f, "255 n"); /* 3 行目 */ for ( i = 0; i < height; i++ ) { for ( j = 0; j < width; j++) { fwrite( &(ExImageR[i][j]), 1, 1, f); fwrite( &(ExImageG[i][j]), 1, 1, f); fwrite( &(ExImageB[i][j]), 1, 1, f); } } fclose(f); } return 0;

6. 今日の練習問題 今日の練習問題の時間は, これまでに出題された C 言語レポート課題に関するプログラム作成, レポート作成に当ててよい

2009/04/17 改 訂 マ ルチ デ ィス プレ イ に つ い て 教育支援事業室 藤村 直美 Mac は外部ディスプレイが接続されていると 内蔵ディスプレイと外部ディスプレイをそれ ぞれ別の表示装置として使えます これは便利ですが 時として問題を引き起こすことがあり ます ここでは Mac Book の内蔵ディスプレイ(1280 800)と外部ディスプレイ 1440 900 が接続されている場合を例に問題点と対応策を説明します マルチディスプレイになると 例えば図1が内蔵ディスプレイ 図2が外部ディスプレイの ような表示になります つまり外部ディスプレイがプロジェクタの場合には授業で説明をしよ うとしている内容は内蔵ディスプレイには表示されますが 外部ディスプレイには何も表示さ れていない状態になります 図1 図2 内蔵ディスプレイの表示例 外部ディスプレイ プロジェクタなど 授業で画面を受講者に見せたい時にはこれは困るので 内蔵ディスプレイと外部ディスプレ イに同じ内容を表示するには次のようにします

(1) (2) (3)

(3) Mac Mac Mac

1024 768 60Hz

参考 Mac では二つディスプレイが接続されていると それぞれの解像度を別に設定することがで きます 次に図8に内蔵ディスプレイ 図9に外部ディスプレイの解像度を設定する画面を同 時に表示した例を示します 図8 内蔵ディスプレイの解像度設定 図9 外部ディスプレイの解像度設定

WebCT 1. http://webct.kyushu-u.ac.jp/ Web Login Safari

SSO-KID SSO-KID

2. V

HTML

3.

4.

CSV UTF-8 Excel Numbers Windows Excel 5.

[ (1) (2) (3)