第7回課題全体のページはこちら → AProg/2017/ex07
応用プログラミング及び実習 2017年度 第7回 課題B†
画像処理プログラムの作成
他人が作ったプログラムを利用して,画像処理をするプログラムを作ってみよう.
画像の用意†
この課題のプログラムでは,アスキー形式(テキスト形式)のPPM画像(カラー)を扱う.まずは,のちの動作確認用に,適当な画像をアスキーPPM形式に変換したものを用意しよう.
- 適当なカラー画像を入手.ブラウザでダウンロードするなりしてお好きなものをどうぞ.ここでは hoge.jpg という名前だったとする.
- 画像の形式を変換.次のようにコマンドを実行すると,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 のようにメニューで処理を選択できるプログラムを作ろう.ただし...
いきなり完成形を考えるのは難しいかもしれない.次のように段階を追って修正していったらよい.
- 入手したファイルをそのままコンパイルして実行してみる
- メニューで処理を選択できるようにするのは後回しにして,ex07image.c で hogeFip を呼んでいるところの書き方と↓の仕様を参考に,hogeNegate や hogeUzumaki を呼ぶようにして動作を確認する.hogeUzumaki の引数については,radius は画像からはみ出さないくらい,thetamax は 3.14 / 2 くらいでまず試して,そこからいろいろ変えてみたらよい.
- メニュー形式で処理を選択できるようにする
関数の仕様など†
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)
- 画素値を反転する関数.
- void hogeFlip(Image *img, int flipMethod)
- 画像を上下左右に反転させる関数.
- img: 画像
- flipMethod: 0以上なら左右反転,0以下なら上下反転(つまり 0 のときは両方反転)
- void hogeUzumaki(Image *img, int radius, double thetamax)
- 画像に「ぐるぐるうずまき」効果を付加する関数.画像の中心から半径 radius の円内の領域を,最大で thetamax だけ回転させる.
- img: 画像
- radius: うずまきの半径
- thetamax: うずまき回転角の最大値(ラジアン)