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

Slides:



Advertisements
Similar presentations
1 全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える 処理後のデータを出力ファイルに書き出す 画像データ用に確保したメモリを解放.
Advertisements

画像情報処理 1 プログラミング課題 知的画像処理研究室 M2 大村 瑞穂. 目次 プログラミング課題の準備 – ファイルのダウンロード・解凍・コンパイル サンプルプログラムの説明 画像処理の方法 レポートに載せる画像について 例題と第 1 回レポート課題.
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
初年次セミナー 第8回 データの入力.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ロボットビジョン(ロボットの視覚能力)のための デジタル画像処理
コンピュータープログラミング(C言語)(3) 1.関数と分割コンパイル (復習) 2.キーボード入力
プログラミング基礎I(再) 山元進.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
初年次セミナー 第4回 整数と実数の取り扱い.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第13回構造体.
データ構造とアルゴリズム 第10回 mallocとfree
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
2014/05/02 知的画像処理研究室 M1 中津美冴 画像情報処理1 ~画像処理プログラミング~ 2014/05/02 知的画像処理研究室 M1 中津美冴
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
第2回 Microsoft Visual Studio C++ を使ってみよう
関数の定義.
プログラミング応用 printfと変数.
第10回関数 Ⅱ (ローカル変数とスコープ).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
Cプログラミング演習 第7回 メモリ内でのデータの配置.
プログラミング 4 記憶の割り付け.
画像処理プログラムの説明.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
デジタル画像とC言語.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語 はじめに 2016年 吉田研究室.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
第5回 プログラミングⅡ 第5回
情報処理Ⅱ 2005年10月28日(金).
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 第2回 2004年10月12日(火).
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
printf・scanf・変数・四則演算
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

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

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

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

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

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

GIMPによる画像処理の体験

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

GIMPの操作画面

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

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

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

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

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

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

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

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

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

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

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

C言語の復習

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

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

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

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

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

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

値渡しと参照渡し 値渡し 参照渡し 値を書き換えても、呼び出し側は影響しない 関数内で値を書き換えることができる 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 );

配列を使った引数 参照渡しになるので、配列内で値を書き換えることができる 呼び出しの度に配列の 大きさが変わる場合は、 配列の大きさも引数に 含めるようにする 引数の宣言に 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 );

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

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

コンパイルと実行の仕組み 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 実行可能なファイルを作成

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

画像処理プログラム

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

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

画像データの表現 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 で表現

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

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

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

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 ); これらはサンプルプログラムをそのまま使って良い

画像処理 画像処理関数(グレー画像) 画像処理関数(カラー画像) 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] );

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

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

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

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

ネガポジ変換 ネガポジ変換の例(サンプルプログラム) 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 ] = 255 - src[ y ][ x ]; }

ガンマ変換 ガンマ変換の例 (サンプルを修正してみる) 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 ); }

カラー画像のガンマ変換 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 );

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

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

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

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

平滑化 平滑化(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; }

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

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