アルコン2008ポスター
↑ ポスター

第12回 パターン・認識・メディア理解 (PRMU) 研究会 アルゴリズムコンテスト 「騎士(ナイト)を数えナイト 〜画像に含まれる特定物体の計数〜」

リファレンス・目次

  1. 画像の扱い方(構造体image)
    1. 画像の作成と開放
      1. 新規画像の作成と開放
      2. 画像の複製
      3. 画像の読み込み
    2. 画像の保存
    3. 画素値の操作
      1. 画素値の獲得
      2. 画素値の変更
    4. 画素値の操作(マクロ版)

1. 画像の扱い方(構造体image)

画像を扱う構造体imageを用意しています。

/* 画像の構造体 */
typedef struct image {
  unsigned char *data;	← 各画素の値
  int width;		←画像の幅
  int height;		←画像の高さ
  int max_lvl;		←画素の最大値(基本的に255)
  int bytes;		←1ピクセルが何バイトで表されているか
				1: グレイスケールの場合
				3: RGBの場合
				4: RGBαの場合
} image;

以下では構造体imageの使い方を説明します。

目次へ戻る

i. 画像の作成と開放

画像の作成方法は、新規画像の作成、画像の複製、 画像の読み込みの3種類があります。 一方、画像の開放は一種類のみです。

a. 新規画像の作成と開放

  /* 宣言 */
  struct image *img;
  /* 画像の作成(500x200のカラー画像を作る場合) */
  img = create_img(500, 200, 3);
  /* 画像を初期化する(画素値を全部0にする) */
  init_img(img);

  ...

  /* メモリの開放 */
  freeImg(img);

500x200のグレースケール画像を作る場合はcreate_imgの3つ目の引数を1にします。

画像の初期化(init_img)は画素値を全部0にするだけなので、必ずしも実行する必要はありません。

b. 画像の複製

  /* 宣言 */
  struct image *img;
  struct image *img_org;

  ...

  /* 画像の複製 */
  img = copy_img(img_org);

  ...

  /* メモリの開放 */
  freeImg(img);
  freeImg(img_org);

c. 画像の読み込み

特に設定をしない場合はPNG形式の画像を扱います。下記の例はPNG形式の画像を読み込む場合です。

  /* 宣言 */
  struct image *img;
  /* 画像の読み込み(PNG画像の場合) */
  img = pngRead("filename.png");

  ...

  /* メモリの開放 */
  freeImg(img);

PPM形式の画像を読み込む場合はpngReadの代わりにpnmReadを使います。

  /* 宣言 */
  struct image *img;
  /* 画像の読み込み(PPM画像の場合) */
  img = pnmRead("filename.ppm");

  ...

  /* メモリの開放 */
  freeImg(img);

目次へ戻る

ii. 画像の保存

a. 画像の保存

特に設定をしない場合はPNG形式の画像を扱います。下記の例はPNG形式の画像を書き込む場合です。

  /* 宣言 */
  struct image *img;

  ...


  /* 画像の書き込み(PNG画像の場合) */
  pngWrite("filename.png", img);
  /* メモリの開放 */
  freeImg(img);

PPM形式の画像を書き込む場合はpngWriteの代わりにpnmWriteを使います。

  /* 宣言 */
  struct image *img;

  ...


  /* 画像の書き込み(PPM画像の場合) */
  pnmWrite("filename.ppm", img);
  /* メモリの開放 */
  freeImg(img);

いずれの場合も、画像を保存してもメモリが開放されないことに注意してください。

目次へ戻る

iii. 画素値の操作

画素値を扱う関数には画素値を得るものと変更するものの2種類あります。 それぞれに画像の範囲を確認するものとしないものの2種類あり、合計4つあります。以下、色cは、グレースケール画像の場合は常に0、RGB画像でRの場合は0、Gの場合は1、Bの場合は2とします。

a. 画素値の獲得

b. 画素値の変更

目次へ戻る

iv. 画素値の操作(マクロ版)

画素値を扱う関数には画素値を得るものと変更するものの2種類あります。 それぞれに画像の範囲を確認するものとしないものの2種類あり、合計4つあります。以下、色cは、グレースケール画像の場合は常に0、RGB画像でRの場合は0、Gの場合は1、Bの場合は2とします。

a. 画素値の獲得と変更(範囲を確認しない):pix

  int x, y, c;
  unsigned char val;

  ...

  /* 画像imgの(x,y,c)座標の色cの値を獲得する
  ((x,y)が画像の範囲外なら、エラーになるかもしれない) */
  val = pix(img, x, y, c);

  ...

  /* 画像imgの(x,y)座標の色cの値を変更する
  ((x,y,c)が画像の範囲外なら、エラーになるかもしれない) */
  pix(img, x, y, c) = val;

b, 画素値の獲得のみ(範囲を確認する):pix_safe

  int x, y, c;
  unsigned char val;

  ...

  /* 画像imgの(x,y,c)座標の色cの値を獲得する
  ((x,y,c)が画像の範囲外なら、何もしない) */
  val = pix_safe(img, x, y, c);

  ...

  /* 画素値の値を変更することはできない(次の操作はエラーになる) */
  /* pix_safe(img, x, y, c) = val; */

目次へ戻る


お問い合わせ:アルコン2008 実行委員会
alcon2008(あっと)m.cs.osakafu-u.ac.jp