第7回課題全体のページはこちら → AProg/2017/ex07

応用プログラミング及び実習 2017年度 第7回 課題B

画像処理プログラムの作成

他人が作ったプログラムを利用して,画像処理をするプログラムを作ってみよう.

画像の用意

この課題のプログラムでは,アスキー形式(テキスト形式)のPPM画像(カラー)を扱う.まずは,のちの動作確認用に,適当な画像をアスキーPPM形式に変換したものを用意しよう.

  1. 適当なカラー画像を入手.ブラウザでダウンロードするなりしてお好きなものをどうぞ.ここでは hoge.jpg という名前だったとする.
  2. 画像の形式を変換.次のようにコマンドを実行すると,hoge.jpg から hoge.ppm というアスキーPPM 画像のファイルを作成できる.
    $ convert  hoge.jpg  ppm:-  |  pnmtoplainpnm  >  hoge.ppm
    • ここでは入力として,拡張子に .jpg とついた JPEG 画像を想定している.しかし,ここで使っている ImageMagick の convert コマンドは,JPEGの他にも様々な画像形式に対応しているので,PNG 画像等でも問題なく変換できる.
    • 上記のようにコマンドを実行すると,入力がグレイスケール画像でも,カラー画像に変換して保存することになる.
    • commandA | commandB のように2つのコマンドを "|" でつないで実行すると,commandAの標準出力をcommandBの標準入力に「接続して」両者を実行することになる.このような実行の仕組みを「パイプ」という.

プログラムの入手

この課題で利用するプログラムを入手しよう.課題Aで zipsearch.c 等をコピーしたのと同じディレクトリに,以下に示す3つのファイルがある.これらを自分の aprog2015 ディレクトリにコピーすればよい.

hogeimage.c
画像処理の関数群を定義したソースファイル.
hogeimage.h
上記を利用する際にインクルードすべきヘッダファイル.
ex07image.c
それらを使ったプログラムのサンプル.

プログラムの作成

ex07image.c を修正して(他の2つは修正不要),第5回課題D のようにメニューで処理を選択できるプログラムを作ろう.ただし...

いきなり完成形を考えるのは難しいかもしれない.次のように段階を追って修正していったらよい.

  1. 入手したファイルをそのままコンパイルして実行してみる
  2. メニューで処理を選択できるようにするのは後回しにして,ex07image.c で hogeFip を呼んでいるところの書き方と↓の仕様を参考に,hogeNegate や hogeUzumaki を呼ぶようにして動作を確認する.hogeUzumaki の引数については,radius は画像からはみ出さないくらい,thetamax は 3.14 / 2 くらいでまず試して,そこからいろいろ変えてみたらよい.
  3. メニュー形式で処理を選択できるようにする

関数の仕様など

hogeimage.h と hogeimage.c で定義されたもののうち,外部から呼び出して使うことを想定して作られたものについて,その仕様(引数と戻り値の意味や使い方の説明)を以下に記す.

Image型
一つの画像の情報をひとまとめに扱うための構造体.各メンバの意味は hogeimage.h 参照.
Image *hogeCreateImage(int width, int height, int maxp)
Image型の変数を生成して初期化する関数.今回の課題ではこの関数を自分で呼び出す必要はない.
  • width: 画像の幅
  • height: 画像の高さ
  • maxp: 画素値の最大値
  • 戻り値: 幅 width, 高さ height,画素値の最大 maxp の画像を表す変数へのポインタ
Image *hogeReadPPM(char filename[])
引数で指定されたファイル名のファイルからPPM画像を読み込む関数.
  • filename: ファイル名
  • 戻り値: 読み込みに成功した場合は,その画像の情報を格納したImage型変数へのポインタ.失敗した場合は 0.
Image *hogeWritePPM(char filename[], Image *img)
引数で指定されたファイル名のファイルにPPM画像を書き出す関数.
  • filename: ファイル名
  • img: 画像
  • 戻り値: 書き出しに成功した場合は,引数 img と同じ値.失敗した場合は 0.
void hogeNegate(Image *img)
画素値を反転する関数.
  • img: 画像
void hogeFlip(Image *img, int flipMethod)
画像を上下左右に反転させる関数.
  • img: 画像
  • flipMethod: 0以上なら左右反転,0以下なら上下反転(つまり 0 のときは両方反転)
void hogeUzumaki(Image *img, int radius, double thetamax)
画像に「ぐるぐるうずまき」効果を付加する関数.画像の中心から半径 radius の円内の領域を,最大で thetamax だけ回転させる.
  • img: 画像
  • radius: うずまきの半径
  • thetamax: うずまき回転角の最大値(ラジアン)

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS