#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: うずまき回転角の最大値(ラジアン)