Presentation is loading. Please wait.

Presentation is loading. Please wait.

画像処理 入力画像に対して何らかの変換処理を行う 明るさやコントラストの調整、ぼかし・鮮鋭化など レタッチ系の画像ツールでよく使われる機能.

Similar presentations


Presentation on theme: "画像処理 入力画像に対して何らかの変換処理を行う 明るさやコントラストの調整、ぼかし・鮮鋭化など レタッチ系の画像ツールでよく使われる機能."— Presentation transcript:

0 免許法認定公開講座: コンピュータグラフィックス
コンピュータグラフィックスC 第2回 2005/4/21 免許法認定公開講座: コンピュータグラフィックス 第2回 画像処理 演習 九州工業大学 情報工学部 システム創成情報工学科 尾下 真樹

1 画像処理 入力画像に対して何らかの変換処理を行う 明るさやコントラストの調整、ぼかし・鮮鋭化など レタッチ系の画像ツールでよく使われる機能

2 画像変換の分類 画素ごとの色変換 領域に基づく色変換 入力画像の同一位置 にあるピクセルの色 (濃淡)から変換
入力画像の同一位置 にあるピクセルの周囲 の色(濃淡)を考慮して 変換

3 演習内容 C言語を使って、テキストに書かれているような画像処理を行うプログラムを作成する
入力画像 を読み込んで、さまざまな変換処理を行い、別の画像として出力するようなプログラム

4 説明・演習手順 画像処理の概要 GIMPによる画像処理の体験 サンプルプログラムのコンパイル C言語の復習 C言語による画像処理
画像データの配列による表現 BMP画像ファイルの読み込み 画像処理プログラムの作成 (各自演習)

5 GIMPによる画像処理の体験

6 GIMPとは? GIMP(GNU Image Manipulation Program) フリーの画像編集ソフト
Photoshop と同様のレタッチ系のソフト 一部使いにくいところもあるが、基本的には、 高機能で便利なソフト 演習用端末には既にインストール済み 自宅のコンピュータにインストールすることも可能

7 GIMPの操作画面

8 GIMPの利用 GIMPを起動する 画像ファイルを開く デスクトップに、GIMPのアイコンがあれば、それをダブルクリック
起動時にエラーが出ても、無視して構わない 画像ファイルを開く 画像ファイルをGIMPのウィンドウにドラッグする GIMPのメニューの、ファイル → 開く を選択して、ファイルダイアログからファイルを選んでも良い

9 GIMPによる画像処理(1) トーンカーブを使った色の変化

10 GIMPによる画像処理(2) ガウアシアンフィルタを使ったぼかし

11 GIMPによる画像処理(3) 他にもいろいろなフィルタがあるので、 時間があるときにでも試してみてください GIMP日本語ドキュメント
GIMPの使い方や各フィルタの説明があります GIMPダウンロード “GTK+ 2 for Windows” と “The GIMP for Win” の最低2つをインストールすれば使えます

12 サンプルプログラムのコンパイル

13 演習環境 C言語を使用 開発環境として Borland C++ を使用 プログラムの記述にはテキストエディタを使用
まずは、サンプルプログラムをコンパイルしてみましょう!

14 サンプルプログラム・データ image.cpp bitmap.h, bitmap.cpp
メインの画像処理プログラム bitmap.h, bitmap.cpp BMP画像の読み書きのための関数のヘッダファイルとソースファイル image1.bmp, image1_gray.bmp テスト用の画像データ

15 サンプルプログラムのコンパイル コンパイル 動作確認 bcc32 image.cpp bmp.cpp
コンパイルに成功すると、 image.exe が生成される 動作確認 image.exe を実行してみる image1_gray.bmp を読み込み image_out.bmp が出力される image_out.bmp を表示確認 image_gray.bmp out_image.bmp

16 プログラムの修正(1) テキストエディタを使って、プログラムを書き換える プログラムを変更したら、再度コンパイルして、実行
演習用端末には、「サクラエディタ」というテキストエディタがインストールされている 自宅でも同じものを使いたい人は、 プログラムを変更したら、再度コンパイルして、実行

17 プログラムの修正(2) 「サクラエディタ」で開いてみましょう image.cpp を 右クリックし、 「サクラエディタ で開く」 を実行

18 プログラムの修正(3) プログラムを修正してみましょう
71行目の入力ファイル名を以下のように修正 コンパイル&実行すると、 image_out.bmp が再度出力 されるので、表示確認 注意:前のファイルは上書きされる 修正前: const char input_file[] = "image1_gray.bmp"; 修正後: const char input_file[] = "image1.bmp";

19 C言語の復習

20 C言語 Cプログラムの構造 以下、C言語の簡単な説明 (復習) 関数の集まりによって構成される 変数の型、配列、ポインタ、制御構文、
関数呼び出し、値渡しと参照渡し 変数のスコープ プリプロセッサ、コンパイルと実行のしくみ

21 変数の型 基本型 演算子 整数 int (32ビット), short (16ビット)
実数 float (32ビット), double (64ビット) 文字 char (8ビット) 真偽 bool (8ビット) 演算子 +, *, /, ==, !=, ||, &&, !, ^, |, &, >>, <<, a?b:c

22 配列 配列 注意 1次元配列 2次元配列 C言語では、配列の大きさはコンパイル時に決定される必要がある
例: int x[ 10 ]; 2次元配列 例: int y[ 10 ][ 10 ]; 注意 C言語では、配列の大きさはコンパイル時に決定される必要がある int a = 10; int x[ a ]; のような記述はできない new や malloc を使うと、動的に配列を割り当てることができる (今回の演習では扱わない)

23 ポインタ変数 変数ではなく、変数のアドレスを指す変数 宣言するときは変数の前に * をつける
ポインタの指す変数を参照するときは * をつける 変数をポインタに変換するときは & をつける 足し算や引き算などもできる メモリ 100 int a = 100; int * b; // ポインタ変数の宣言 b = & a; // アドレス演算子 *b = 200; // ポインタの指す 先に入力 a b

24 制御構文 条件に応じて分岐や繰り返しを行う if for while do~while switch break 説明は省略

25 関数呼び出し 関数 引数・戻り値を宣言 他の関数から呼び出す ことができる int square( int x ) { int y;
y = x * x; return y; } void main() int a = 10, b; b = square( a ); printf( “%d”, b );

26 値渡しと参照渡し 値渡し 参照渡し 値を書き換えても、呼び出し側は影響しない 関数内で値を書き換えることができる
int square( int x ) { x = x * x; return x; } void main() int a = 10, b; b = square( a ); printf( “%d”, b ); void square( int x, int * y ) { *y = x * x; } void main() int a = 10, b; square( a, &b ); printf( “%d”, b );

27 配列を使った引数 参照渡しになるので、配列内で値を書き換えることができる
呼び出しの度に配列の 大きさが変わる場合は、 配列の大きさも引数に 含めるようにする 引数の宣言に const を つけると、値を書き換え ることができなくなる void fill_zero( int x[], int size ) { for ( int i=0; i<size; i++ ) x[ i ] = 0; } void main() int a[ 10 ], b[ 20 ]; fill_zero( a, 10 ); fill_zero( b, 20 );

28 変数のスコープ グローバル変数 ローカル変数 関数外で宣言された変数 全ての関数からアクセスできる 関数内で宣言された変数
関数の外部からはアクセスできない static をつけると静的変数になる 呼び出しの度に初期化されない グローバル変数と同名の変数をつけると、グローバル変数が隠蔽される int x; int put( int i ) { float x; static int y; }

29 プリプロセッサ C/C++では、コンパイルの前にプリプロセッサによってソースが処理される
ソースに対してテキスト処理(文字列の置き換えなど)を行う # で始まるのがプリプロセッサのためのコマンド #include<~>・・・他のファイルを読み込む、主にヘッダファイルの読み込みに使用 同一ディレクトリのファイルを読み込む場合は、 “ “ で囲む #define A b ・・・ Aをbで置き換える 定数を使うときなどに使用

30 コンパイルと実行の仕組み a.h b.h c.h a.c b.c a.obj b.obj c.lib abc.exe ヘッダファイル
ソースファイル 他のソースの関数を使用する場合はヘッダファイルをインクルード コンパイル 外部ライブラリ a.obj b.obj オブジェクトファイル(中間形式) c.lib リンク abc.exe 実行可能なファイルを作成

31 コンパイルと実行の仕組み コンパイル リンク それぞれのソースファイルをコンパイルして中間ファイル(オブジェクトファイル)を生成
全てのオブジェクトファイルと必要なライブラリをリンクして実行形式のプログラムを生成

32 画像処理プログラム

33 サンプルプログラムの構成 メイン関数 ( main() )
画像の読み込み → 画像処理 → 画像の出力 入力画像: src_image, 出力画像: dest_image 画像処理を行う関数 ( process_gray(), process_color() ) 入力画像を変換した結果を出力画像に格納 この関数を適宜書き換える 画像の読み書きを行う関数 ( loadBitmap(), saveBitmap() )

34 画像データ (復習) 画像データはピクセルの集まりによってできている R, G, B = (0.66, 0.75, 0.94)

35 画像データの表現 C言語の多次元配列を使って表現できる グレー画像(2次元配列) カラー画像(3次元配列)
unsigned char image[ 100 ][ 100 ]; image[ y ][ x ] ピクセルの明るさを 0~255 で表現 カラー画像(3次元配列) unsigned char image[100][100][3]; 赤(R)・緑(G)・青(B) の各成分の 明るさを 0~255 で表現

36 画像データの表現 C言語で多次元配列を使う場合の注意
配列の大きさはコンパイル時に決定しておく必要がある (画像サイズに応じて変えるようなことはできない) サンプルプログラムでは、あらかじめ広めの配列を確保しておき、その一部または全体を使用するようにしている ※ 多次元配列を使わない方法もあるが、やや複雑になるので、今回は省略

37 画像ファイル 画像をファイルに記録するための形式(フォーマット)として様々なものがある 非圧縮 可逆圧縮 非可逆圧縮
BMP(Windows標準), TIFF 可逆圧縮 圧縮BMP, 圧縮TIFF, PNG 非可逆圧縮 GIF (最大256色) JPEG (自然画向き、サイズと画質を調節可能)

38 BMPファイルの構造 ヘッダ (パレット情報) 画像データ 画像サイズやカラーモードなどの情報を格納
パレットモード(256色以下)の場合、パレット情報を格納 画像データ 各ピクセルの色のデータを順番に格納

39 BMPファイルの読み書き BMP画像の読み込み関数 BMP画像の書き込み関数 これらはサンプルプログラムをそのまま使って良い
int loadBitmap( const char * file_name, unsigned char ** bmp_data, int * bmp_width, int * bmp_height, int * byte ); 入力:ファイル名 出力:画像の幅、画像の高さ、ピクセルデータ(幅×高さの配列)、ピクセルごとのデータサイズ BMP画像の書き込み関数 int saveBitmap( const char * file_name, unsigned char ** data, int width, int height, int byte ); これらはサンプルプログラムをそのまま使って良い

40 画像処理 画像処理関数(グレー画像) 画像処理関数(カラー画像)
process_gray( int width, int height, const unsigned char src[Y_MAX_SIZE ][ X_MAX_SIZE ], unsigned char dest[Y_MAX_SIZE ][ X_MAX_SIZE ] ); 画像処理関数(カラー画像) process_color( int width, int height, const unsigned char src[Y_MAX_SIZE][X_MAX_SIZE][3], unsigned char dest[Y_MAX_SIZE ][ X_MAX_SIZE ][3] );

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

42 画像変換の分類 画素ごとの色変換 領域に基づく色変換 入力画像の同一位置 にあるピクセルの色 (濃淡)から変換
入力画像の同一位置 にあるピクセルの周囲 の色(濃淡)を考慮して 変換

43 画素ごとの色変換 画素ごとの色変換(トーンカーブによる変換) カラー画像への適用 疑似カラー、色相・明度・彩度(今回は省略) ネガポジ
ガンマ 折れ線 S字 ポスタリジェーション・2値化 ソラリゼーション カラー画像への適用 疑似カラー、色相・明度・彩度(今回は省略)

44 画素ごとの色変換 変換関数の作成 画像の各ピクセルごとに変換を行う src[ y ][ x ] から dest[ y ][ x ] を計算
各ピクセルの色を、別の色に変換 src[ y ][ x ] から dest[ y ][ x ] を計算 各変数は、unsigned char 型なので、0~255 の範囲の値をとる 変換後の値が 0~255 の間になるように注意する必要がある

45 ネガポジ変換 ネガポジ変換の例(サンプルプログラム) void process_gray( int width, int height,
const unsigned char src[ Y_MAX_SIZE ][ X_MAX_SIZE ], unsigned char dest[ Y_MAX_SIZE ][ X_MAX_SIZE ] ) { int x, y; for ( y=0; y<height; y++ ) for ( x=0; x<width; x++ ) dest[ y ][ x ] = src[ y ][ x ]; }

46 ガンマ変換 ガンマ変換の例 (サンプルを修正してみる) pow( x, y ) は、x の y乗を計算するCの標準関数
この例では γ= 1/2 (値をいろいろ変えて試してみる) 255.0 と書かなければいけない点に注意 255 と書くと、src[ y ][ x] も 255 も整数なので、割り算の結果が整数に丸められてしまう( (double) 255 でも可) for ( y=0; y<height; y++ ) { for ( x=0; x<width; x++ ) dest[ y ][ x ] = 255 * pow( src[ y ][ x ] / 255.0, 0.5 ); }

47 カラー画像のガンマ変換 R, G, B のそれぞれごとに変換 どちらの書き方でも良い int x, y;
for ( y=0; y<height; y++ ) { for ( x=0; x<width; x++ ) dest[ y ][ x ][ 0 ] = 255 * pow( src[ y ][ x ] / 255.0, 0.5 ); dest[ y ][ x ][ 1 ] = 255 * pow( src[ y ][ x ] / 255.0, 0.5 ); dest[ y ][ x ][ 2 ] = 255 * pow( src[ y ][ x ] / 255.0, 0.5 ); } for ( int c=0; c<3; c++ ) dest[ y ][ x ][ c ] = 255 * pow( src[ y ][ x ] / 255.0, 0.5 );

48 その他の変換 教科書を参考に他の変換も試してみる → レポート課題1 その他の変換(一部の変換には if 文を使う必要がある)
折れ線 (どのような折れ線を使うかは、自分で適当に決めて良い) S字 ポスタリジェーション、2値化 (ソラリゼーション) カラー画像にも適用 RGBに共通の変換、RGB の一部のみを変換、 あるいは、異なる変換などを適用してみる

49 Cの標準関数 算術演算には、Cの標準関数が使える sin(x), cos(x) ( x の単位はラジアン 0~2π)
pow(x, y)  x の y 乗を計算

50 領域に基づく色変換 領域に基づく色変換(空間フィルタリング) 周囲のピクセルに、一定の値をかけて混ぜ合わせることで、変換を行う
混ぜ合わせ 比率の調整 により、さま ざまな効果 を得る

51 領域に基づく色変換 変換関数の作成 注意点 各ピクセルの周囲の色を考慮して、ピクセルの色を変換
src[ y -α ][ x -α ] ~ src[ y+α ][ x+α ] を一定の比率で混ぜ合わせて、 dest[ y ][ x ] を計算 混ぜ合わせる比率を配列として用意しても良い 注意点 実数で計算されるように気をつける必要がある 画像の端での処理に気をつける必要がある

52 平滑化 平滑化(3×3)の例 端のピクセルは処理から除いていることに注意 端が真っ黒になってしまう (どうしたら黒くならないか?)
int x, y; for ( y=1; y<height-1; y++ ) { for ( x=1; x<width-1; x++ ) dest[ y ][ x ] = ( src[ y -1 ][ x-1 ] + src[ y -1 ][ x ] + src[ y-1 ][ x+1 ] + src[ y ][ x-1 ] + src[ y ][ x ] + src[ y ][ x+1 ] + src[ y+1 ][ x-1 ] + src[ y+1 ][ x ] + src[ y+1 ][ x+1 ] ) / 9.0; }

53 その他の変換 教科書を参考に他の変換も試してみる → レポート課題2 その他の変換 カラー画像にも適用 平均化(5×5)
重み付き平均化(3×3、5×5) メディアンフィルタ エッジ抽出(横方向、縦方向、ラプラシアン) エッジが出るように、計算結果をさらに数倍すると良い 鮮鋭化 カラー画像にも適用

54 レポート課題 課題1 画素ごとの色変換(基本) 課題2 領域にもとづく色変換(基本) 課題3 画素ごとの色変換(応用)
課題1 画素ごとの色変換(基本) 2種類の変換を作成して適用 課題2 領域にもとづく色変換(基本) 課題3 画素ごとの色変換(応用) 与えられた画像を、適切な明るさ・ コントラストの画像に変換 課題4 領域にもとづく色変換(応用) 画像の端の変換にも対応する


Download ppt "画像処理 入力画像に対して何らかの変換処理を行う 明るさやコントラストの調整、ぼかし・鮮鋭化など レタッチ系の画像ツールでよく使われる機能."

Similar presentations


Ads by Google