画像処理プログラミング

画像情報処理1
プログラミング課題
知的画像処理研究室
M2 大村 瑞穂
目次
• プログラミング課題の準備
– ファイルのダウンロード・解凍・コンパイル
• サンプルプログラムの説明
• 画像処理の方法
• レポートに載せる画像について
• 例題と第1回レポート課題
目次
• プログラミング課題の準備
– ファイルのダウンロード・解凍・コンパイル
• サンプルプログラムの説明
• 画像処理の方法
• レポートに載せる画像について
• 例題と第1回レポート課題
サンプルプログラムのダウンロード
http://www.iipl.is.ritsumei.ac.jp/
クリック
サンプルプログラムのダウンロード
http://www.iipl.is.ritsumei.ac.jp/Event_others.html
ファイルの解凍方法,コンパイル,実行方法などは
このページに全て書いてあります!
このPPTはこのHPの下の方から
ダウンロードできます!
目次
• プログラミング課題の準備
– ファイルのダウンロード・解凍・コンパイル
• サンプルプログラムの説明
• 画像処理の方法
• レポートに載せる画像について
• 例題と第1回レポート課題
圧縮ファイルの内容
1. ImageFileIO.c
2.
3.
4.
5.
6.
7.
8.
9.
10.
ImageFileIO.h
ImageFilter.c
ImageFilter.h
main.c
○○○.ppm
○○○.pgm
ImageTools.c
ImageTools.h
Makefile
1. 画像の読み込み, 出力データの書き
出しなどを行う関数の定義
2. ImageFileIO.c内の関数の宣言
3. データを画像処理する関数の定義
4. ImageFilter.c内の関数の宣言
5. メインプログラム
6. カラー画像ファイル
7. モノクロ画像ファイル
8. 今回は関係なし
9. 今回は関係なし
10. makeファイル
コンパイルの方法
• Makefile
– makeコマンドを使用する為のファイル
– makeコマンド・・・複数のファイルを同時に順序よく
コンパイルするコマンド
makeコマンドを実行し, コンパイルと
リンクを自動的に行う
imgfilterという実行ファイルが作成される
% ./imgfilter
画像の表示
• displayコマンドで確認
% display Castle.ppm &
• 画像の表示が上手くいかない場合
– ディスク容量がいっぱい?
% du –sh
・・・ディスク使用量の確認
• Netscapeのキャッシュの削除
– Netscapeを立ち上げる
編集→設定→詳細→キャッシュ
– キャッシュのクリアを行い,保存するキャッシュ容量も
減らすことをオススメします(デフォルトは50MB)
メイン関数 (main.c)
• main.c
int main(void) {
// 画像処理を行う関数の呼び出し
// 例1)PPM形式の入力データをネガ画像に変換
NegativeImage();
// 例2)PGM形式のデータに線を描く
// DrawLines();
// 正常終了
return 0;
}
– main()関数からNegativeImage()関数が呼び出さ
れている
画像処理関数(ImageFilter.c)
• ImageFilter.c
– void NegativeImage(void)
• PPM形式の入力データをネガ画像に変換
void NegativeImage(void) {
・・・
// PPM形式の入力データの読み込み
pRGBInputData = ReadPpm(&iWidth, &iHeight, &iMaxValue);
・・・
}
入出力関数(ImageFileIO.c)
• ReadPpm(int * iWidth, int * iHeight, int * iMaxValue)
– PPMファイルの読み込み
• WritePpm(struct RGB * pRGBOutputData, int iWidth, int
iHeight, int iMaxValue)
– PPMファイルへ書き出し
• GetAxisFromIndex(int iWidth, int iIndex, int * iX, int * iY)
– 1次元のインデックスから2次元座標を取得
など・・・
目次
• プログラミング課題の準備
– ファイルのダウンロード・解凍・コンパイル
• サンプルプログラムの説明
• 画像処理の方法
• レポートに載せる画像について
• 例題と第1回レポート課題
画像処理の手順
1. ImageFilter.cに関数を追加する
– BinaryImage(void)
2. ImageFilter.h内で関数の宣言を行う
3. main.c内のmain()関数から呼び出す
4. makeコマンドでコンパイル
つまり・・・
プログラミングの際に変更するファイルは,
ImageFilter.c・ImageFilter.h・main.cの3つ
周辺画素の処理
(フィルタリングプログラムを作成する際の注意)
注目画素
端の画素の例外処理を忘れずに行うこと
目次
• プログラミング課題の準備
– ファイルのダウンロード・解凍・コンパイル
• サンプルプログラムの説明
• 画像処理の方法
• レポートに載せる画像について
• 例題と第1回レポート課題
レポートに画像を添付する際の注意
• pgm画像およびppm画像は, そのままだとレ
ポートには載せられません(latexでもwordで
も)
• 次の方法でファイル形式を変換してから載せ
てください
ファイル形式変換方法(Linux)
•
•
1.
2.
3.
4.
ターミナル画面で↓を入力
>display ○○.pgm
ImageMagic(画像表示ツール)が起動されたら以
下の手順で変換
表示された画像を右クリック→Save
Formatボタンをクリック
変換後のファイル形式を選んでSelect(latexに載
せる場合はeps形式がいいと思います)
必要ならファイル名を変更し, Saveをクリック,
Selectをクリック
ファイル形式変換方法(Windows)
• irfanview
(http://www8.plala.or.jp/kusutaku/iview/)を
使うと好きな形式に変換することができます
latexで画像を添付する方法
• 以下のコマンドをレポートに貼り付け
\begin{figure}[htbp]
\begin{center}
\epsfile{file=○○.eps,width=1.0\hsize}
\caption{レポート上に表示させるタイトル}
\label{fig:○○}
\end{center}
\end{figure}
• 参考:
http://www002.upp.so-net.ne.jp/latex/zu.html
• 何か質問があれば,TAの大村
(CC4F 知的画像処理研究室(陳研))まで
• メールアドレス:[email protected]
目次
• プログラミング課題の準備
– ファイルのダウンロード・解凍・コンパイル
• サンプルプログラムの説明
• 画像処理の方法
• レポートに載せる画像について
• 例題と第1回レポート課題
プログラム例題
• 白黒画像(pgmファイル)から,反転画像を作
成する
• 反転画像は,255から各画素の値を引き,そ
の値を新しい画素値とすることで作成できる
手順1
• ImageFilter.cの中に反転画像を作成する
ReversalImage(void)という関数を作る
#include <stdio.h>
#include <stdlib.h>
・・・・・・
void NegativeImage(void) {
int iWidth, iHeight, iMaxValue;
・・・・・・
}
void DrawLines(void) {
int iWidth, iHeight, iMaxValue;
・・・・・・
}
void ReversalImage(void){
}
ImageFilter.c
手順2
• 関数ReversalImageの中で反転処理を実装
void ReversalImage(void){
int iWidth, iHeight, iMaxValue; //横幅のサイズ,縦幅のサイズ, 最大輝度値
int *piInputData; //入力画像の画素値を格納
int *pRVOutputData; //出力画像の画素値を格納
ImageFilter.c
int I; //ループ変数
printf(“**** Reversal Image ****\n”);
//入力画像の読み込み
piInputData = ReadPgm(&iWidth, &iHeight, &iMaxValue);
//出力画像のメモリ確保
pRVOutputData = (int *)malloc(iWidth*iHeight*sizeof(int));
//反転処理
for(i=0; i<iWidth*iHeight; i++){
pRVOutputData[i] = 255 - piInputData[i];
}
FreePgm(piInputData); //入力画像のメモリ解放
WritePgm(pRVOutputData, iWidth, iHeight, iMaxValue); //出力画像の書き出し
FreePgm(pRVOutputData); //出力画像のメモリ解放
}
手順3
• ImageFilter.h内でReversalImage関数の宣言
#ifndef _IMAGEFILTER_H_
#define _IMAGEFILTER_H_
void NegativeImage(void);
void DrawLines(void);
void ReversalImage(void);
#endif
ImageFilter.h
手順4
• main.c内のmain()関数でReversalImage関数
を呼び出し
#include <stdio.h>
#include "ImageFilter.h"
main.c
int main(void) {
// NegativeImage();
// DrawLines();
ReversalImage();
return 0;
}
!他の関数をコメントアウトするのを忘れないようにしてください!
手順5
• コマンドプロンプトで「make」と入力する
• コンパイルが行われ,imgfilterという名前の
実行ファイルが作成される
• 「./imgfilter」でプログラムを実行
• 第1回レポート課題では,今回の例題にある
ReversalImage(void)の代わりに
BinaryImage(void)という2値化を行う関数を
作ってください
• ImageFilter.h内での宣言やmain関数内での
呼び出しの仕方は,例題と同じです