#author("2017-10-26T11:24:44+09:00","default:takataka","takataka")
#author("2017-10-31T13:03:43+09:00","default:takataka","takataka")

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

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


&color(blue){画像処理プログラムの作成};

他人が作ったプログラムを利用して,画像処理をするプログラムを作ってみよう.
***画像の用意 [#e182eb79]

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

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

***プログラムの入手 [#l4fb0a49]

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

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

***プログラムの作成 [#yffc2ac3]

ex07image.c を修正して(他の2つは修正不要),[[第5回課題D>AProg/2017/ex05#kadaiD]] のようにメニューで処理を選択できるプログラムを作ろう.ただし...
- ↓に hogeimage.c で用意された関数の仕様があるので,参考にしよう.
- このページの下の方に hogeimage.c で用意された関数の仕様が説明されてるので,参考にしよう.
- 第5回課題Dのメニュー項目を次のように一つ増やし,そのメニューを選択した場合にはうずまき半径と回転角の最大値も scanf するようにしよう.
#pre{{
次のことができるよ: [1] 画素値反転  [2] 左右反転  [3] 上下反転  [4] うずまき  [99] ファイルに書き出す
どうする?:   
}}
- hogeimage.c では数学関数を使っているので,コンパイルの際には,&color(red){リンク時に -lm オプションを付ける必要があることに注意.};
 $ cc  hogeimage.o  ex07image.o  -lm  -o  ex07image

いきなり完成形を考えるのは難しいかもしれない.次のように段階を追って修正していったらよい.
+ 入手したファイルをそのままコンパイルして実行してみる
+ メニューで処理を選択できるようにするのは後回しにして,ex07image.c で hogeFip を呼んでいるところの書き方と↓の仕様を参考に,hogeNegate や hogeUzumaki を呼ぶようにして動作を確認する.hogeUzumaki の引数については,radius は画像からはみ出さないくらい,thetamax は M_PI / 2 (M_PI は math.h の中で円周率の近似値に #define されている)くらいでまず試して,そこからいろいろ変えてみたらよい.
+ メニュー形式で処理を選択できるようにする
***関数の仕様など [#ee425f15]

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