第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 の内蔵ディスプレイ(1280800)と外部ディスプレイ（1440900）が接続されている場合を例に問題点と対応策を説明します。
マルチディスプレイになると、例えば図１が内蔵ディスプレイ、図２が外部ディスプレイのような表示になります。つまり外部ディスプレイがプロジェクタの場合には授業で説明をしようとしている内容は内蔵ディスプレイには表示されますが、外部ディスプレイには何も表示されていない状態になります。

図１

図２

内蔵ディスプレイの表示例

外部ディスプレイ（プロジェクタなど）

授業で画面を受講者に見せたい時にはこれは困るので、内蔵ディスプレイと外部ディスプレイに同じ内容を表示するには次のようにします。

(1) 図３に示すように画面左上のリンゴのアイコンをクリックし、「システム環境設定」を選びます。図４が表示されます。

図３

システム環境設定の選択(2) ディスプレイの設定を行うために図４で「ディスプレイ」をクリックします。

図４

ディスプレイの選択(3) ディスプレイの設定画面が図５のように表示されます。ここでは画面の解像度を指定できる画面ですが、「調整」を選択すると図６のように二つのディスプレイをどうするかを選択することができます。「調整」は２台のディスプレイが接続されている状態でないと表示されません。

図５

図６

解像度の設定画面

２画面の取り扱い設定(3) 図６で「ディスプレイをミラーリング」にチェックをつけると、図７に示すように二つの画面が一つとして扱われ、両方のディスプレイに同じ内容が表示される設定になります。
プロジェクタを接続した教員用 Mac で、手元の Mac の内蔵ディスプレイの画面とプロジェクタで投影されている画面の内容が異なる時は、ログインして、上述の方法でディスプレイのミラーリングを有効にしてください。
教育情報システムの Mac はログアウトすると電源を再投入するようになっているために、設定が元に戻ります。プロジェクタの設定を変更するためにはログインしていないとできず、ログアウトすると設定が元に戻すことから、最初のログイン画面をプロジェクタに投影して学生に見せることはできないことになります。

図７

ディスプレイを一つにまとめた場合２つのディスプレイに同一の内容を表示するようにミラーリングすると、画面の解像度が低い方（大抵はプロジェクタ）にあわせられてしまい、いささか情けない状態になります。ここで「ディスプレイ」を選択して、プロジェクタで投影可能で、なるべき解像度の高い設定すると、比較的に作業がしやすくなります。部屋によって接続されているプロジェクタの性能が異なることから、これが最適という値を一律には書けませんが、何カ所かで試した結果では、1024768（60Hz）ぐらいなら大抵のプロジェクタで何とか対応できるようで、授業もそれなりに可能なようです。できるだけ自分が担当する教室での最適値を見つけてみて頂くようにお願いします。

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

図８

内蔵ディスプレイの解像度設定

図９

外部ディスプレイの解像度設定

教員用 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) 右側の「管理」の下の方にある「ユーザ管理」を選択します。次のような画面になるので、「ユーザに，セクション内で自分自身を学生として登録することを許可する」を「真」にします。

以上で学生が自分で授業に登録できるようになり、「コース一覧」に表示される授業に人のマークがつきます。