Top / AProg / 2016 / ex06E

第6回課題全体のページはこちら → AProg/2016/ex06

応用プログラミング及び実習 2016年度 第6回 課題E [edit]

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

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

画像の用意 [edit]

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

PPM画像は,次のいずれかの方法で入手したらよい

  1. AProg/omake#image の blackuni3.ppm をダウンロード
  2. 自分の好きな画像(JPEGやPNG等の形式のもの)を,AProg/omake#image の説明に従って convert コマンドでテキストPPMに変換する.

プログラムの入手 [edit]

この課題で利用するプログラムを入手しよう./roes/sample/takataka/aprogXY ディレクトリに,以下に示す3つのファイルがある.これらを自分の aprog20XY ディレクトリにコピーすればよい.

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

プログラムの作成 [edit]

ex06image.c を修正して(他の2つは修正不要),以下の実行例に示すようにメニューで処理を選択できるプログラムを作ろう.ただし...

  • ↓に hogeimage.c で用意された関数の仕様があるので,参考にしよう.
  • 「うずまき」を選択した場合にはうずまき半径と回転角の最大値も scanf するようにしよう.
  • hogeimage.c では数学関数を使っているので,コンパイルの際には,リンク時に -lm オプションを付ける必要があることに注意.
    $ cc  hogeimage.o  ex06image.o  -lm  -o  ex06image

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

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

実行例:

$ ./ex06image
入力ファイル名を指定してください: uni3.ppm
幅 192 画素,高さ 144 画素
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [4] うずまき  [99] ファイルに書き出す
どないする?:1
ほげ〜,画素値反転したで
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [4] うずまき  [99] ファイルに書き出す
どないする?:3
ほげ〜,上下反転したで
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [4] うずまき  [99] ファイルに書き出す
どないする?:6 
ほげほげ〜,わからへん
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [4] うずまき  [99] ファイルに書き出す
どないする?:4
半径は?:70
回転角の最大値は?:1.5
ぐるぐる〜,うずまき加工したで
次のことができるほげ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [4] うずまき  [99] ファイルに書き出す
どないする?:99
出力ファイル名を指定してください: hoge.ppm

関数の仕様など [edit]

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
Last-modified: 2016-10-28 (金) 11:43:50 (902d)