Microsoft PowerPoint - handout08.ppt

Similar documents
Microsoft PowerPoint - handout09.ppt [互換モード]

Microsoft PowerPoint - kougi8.ppt

Microsoft PowerPoint - handout09.ppt

情報画像工学実験I-1

ディジタル信号処理

ディジタル信号処理

untitled

演算増幅器

02: 変数と標準入出力

情報処理演習 B8クラス

計算機プログラミング

02: 変数と標準入出力

Microsoft Word - Cプログラミング演習(10)

Microsoft PowerPoint - adi05.ppt [互換モード]

Microsoft PowerPoint - 14th.ppt [互換モード]

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

Microsoft PowerPoint - 第3回目.ppt [互換モード]

ファイル入出力

Microsoft PowerPoint - kougi7.ppt

02: 変数と標準入出力

ファイル入出力

C言語講座 ~ファイル入出力編~

02: 変数と標準入出力

Prog1_12th

memo

PowerPoint Presentation

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint Presentation

PowerPoint プレゼンテーション

※ ポイント ※

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

Microsoft PowerPoint - kougi6.ppt

FORTRAN( と C) によるプログラミング 5 ファイル入出力 ここではファイルからデータを読みこんだり ファイルにデータを書き出したりするプログラムを作成してみます はじめに テキスト形式で書かれたデータファイルに書かれているデータを読みこんで配列に代入し 標準出力に書き出すプログラムを作り

2006年10月5日(木)実施

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

操作説明書 AV-HS410 用イメージ転送ソフトウェア JAPANESE M0412TY0 -FJ VQT4K83

プログラミング基礎

Microsoft Word - Cプログラミング演習(9)

02: 変数と標準入出力

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog06.ppt

Taro-ファイル処理(公開版).jtd

Microsoft PowerPoint - CproNt02.ppt [互換モード]

gengo1-12

Microsoft PowerPoint - prog04.ppt

PowerPoint プレゼンテーション

格子点データの解析 1 月平均全球客観解析データの解析 客観解析データや衛星観測データのような格子点データは バイナリ形式のデータファイルに記録されていることが多いです バイナリ形式のデータファイルは テキスト形式の場合とは異なり 直接中身を見ることができません プログラムを書いてデータを読み出して

AquesTalk プログラミングガイド

Microsoft Word - no204.docx

02: 変数と標準入出力

slide4.pptx

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

スライド 1

02: 変数と標準入出力

memo

Microsoft PowerPoint - kougi9.ppt

02: 変数と標準入出力

Microsoft PowerPoint pptx

ファイルシステム

Microsoft Word - no15.docx

AquesTalk2 Win マニュアル

Microsoft PowerPoint - handout10.ppt

AquesTalk Win Manual

Microsoft PowerPoint - kougi2.ppt

gengo1-12

pp2018-pp9base

本書は INpMac v2.20(intime 5.2 INplc 3 Windows7/8/8.1に対応 ) の内容を元に記載しています Microsoft Windows Visual Studio は 米国 Microsoft Corporation の米国及びその他の国における登録商標です

Microsoft PowerPoint ppt

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

PowerPoint プレゼンテーション

Microsoft PowerPoint - 12.ppt [互換モード]

gengo1-12

memo

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft Word - no12.doc

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

memo

もう少し詳しい説明 1. アルゴリズムを構築するための 4 枚のサンプル画像を次々と読み込むここで重要なことは画像を順番に読み込むための文字列操作 for 文の番号 i を画像の番号として使用している strcpy は文字列のコピー,sprinf は整数を文字列に変換,strcat は文字列を繋げる

Microsoft PowerPoint - Lec04 [互換モード]

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

AquesTalk for WinCE プログラミングガイド

Microsoft PowerPoint - 12.ppt [互換モード]

情報処理概論(第二日目)

02: 変数と標準入出力

Microsoft Word - no103.docx

演算増幅器

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

02: 変数と標準入出力

基礎プログラミング2015

臨床画像技術学Ⅱ

Microsoft PowerPoint - prog03.ppt

Microsoft PowerPoint - 13.ppt [互換モード]

PowerPoint Presentation

Microsoft PowerPoint - handout07.ppt [互換モード]

プログラミング実習I

PowerPoint プレゼンテーション

Microsoft Word - SKY操作マニュアル.doc

Microsoft PowerPoint - 11.pptx

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

Transcription:

応用プログラミング第 8 回 ~ プログラミングの応用画像処理入門 1~ 本日の内容 1. 画像処理入門 ~ 画像を知る ~ 1. CCD カメラの仕組み 2. グレースケール画像 3. カラー画像 4. 画像ファイルのフォーマット 5. 画像の入出力 2. 課題 3 電気通信大学電子工学専攻 Intelligent Electronic Systems roup 長井隆行 FILE 構造体とは?( 前回の補足 ) FILE 構造体 操作するファイルの情報を格納する構造体 ファイルの情報とは現在読み書きしているファイルのアドレス ( 位置 ) など 直接この構造体にアクセスすることはあまりない 普通はfopenやrintfなどで指定するだけ 以下は参考までにFILE 構造体の例 ( コンパイラによって異なる ) いよいよ画像 白黒濃淡画像 ( グレースケール画像 ) typedef struct { unsigned char *curp; /* Current active pointer */ unsigned char *buffer; /* Data transfer buffer */ int level; /* fill/empty level of buffer */ int bsize; /* uffer size */ unsigned short istemp; /* Temporary file indicator */ unsigned short flags; /* File status flags */ wchar_t hold; /* Ungetc char if no buffer */ char fd; /* File descriptor */ unsigned char token; /* Used for validity checking */ } FILE; /* This is the FILE object */ 画素 ( ピクセル ) 一般的には8bit ~の範囲 (8bppなどと呼ぶ)

いよいよ画像続き カラー画像 メモリ上ではどうなってるの? 2 次元の情報である画像をどのようにメモリ (1 次元の配列 ) に収めるか? add value 5 1 x x1 5 2 1 x2 x3 1 2 15 2 x4 x5 1 画素 ( ピクセル ) 一般的には 24bit がそれぞれ ~ の範囲 (24bpp などと呼ぶ ) 必ずしもこの順番である必要はない どのように並べるかは基本的にプログラマの自由画面へ表示するためには いくつか約束事があるファイルに保存する場合も決まったやり方がある ( フォーマット ) x6 x7 x8 x9 xa 15 2 カラー画像の場合は? 画像ファイルのフォーマット 一般に 24bpp とは各画素が ~ 16777216 の値をもっているのではなく 画像が成立するための必要な情報 画像データ本体 当然必要 画像データ ( 赤 ) ( 緑 ) ( 青 ) がそれぞれ ~ (8bit) の値をもっている 8 3 = 24(bit) 計 64 枚のタイルを渡されて これ並べて と命令されてもどのように並べればいいか分からない 2 1 2 画像のサイズ どんな順番で並んでいるか カラーかグレースケールか (1ピクセルのビット数) などなど ヘッダ情報

画像ファイルのフォーマット続き 画像の表現の仕方は色々あり得る みんなが使えるように画像の表現方法の約束を決める ヘッダ情報や画像データをどのように記録しておくか に関する取り決め ビットマップ (.bmp) windowsで標準 Jpeg (.jpg) 圧縮画像の標準形式 TIFF (.tif) DTPなどでよく使用される IF (.gif) インターネットでよく使用される (256 色 ) ポータブルグレーマップ (.pgm) Xwindow(Unix) でよく 使われる.pgm( ポータブルグレーマップ ) グレースケール画像に対する最もシンプルな画像ファイルフォーマット PM P5 フォーマット ( グレースケール バイナリ ) P5 画像の横幅縦幅 32 24 最大階調値 rrtuvwxxz {}~~ =cту左 演糾給血麹克諮瑞荘葬涛湯粕燈末楓迄劍劍履囹囮囹尹屆屁惧撼撼棍沺棍 ヲ ヲヲ ヲヲ ヲヲァヲヲヲァァァァヲィァァィァァィィァゥィゥィゥゥィィィゥェィィィゥェィィゥィゥゥィィゥゥェェェゥゥゥォォォォォォォゥゥゥェゥゥェゥゥェゥェィェゥィゥゥィゥゥィィゥィァ ヲィヲァァィィァィァィヲヲァヲヲヲァヲ ヲヲ ヲ ずっと続く ファイル識別子 pgm (P5) をテキストエディタで強引に開いたもの ヘッダ バイナリ画像データ 1 バイト /1 画素 ITMAPFILEHEADE( ファイルヘッダ ).bmp( ビットマップ ) Windows では標準のビットマップ PM より複雑 ( 基本的な考え方は同じ ) ヘッダ情報 ( バイナリ ) 画像データ ( バイナリ ) 2byte ファイルのタイプ "M" 4byte ファイルのサイズ (byte) 2byte 予約 1 2byte 予約 2 14byte 4byte byte 数は画像サイズによる 4byte ITMAPFILEHEADE から実際のビットマップデータまでのオフセット値ヘッダーのサイズと考えてよい (byte) ITMAPINFOHEADE( 情報ヘッダ ) 4byte 情報ヘッダのサイズ 4 4byte 画像の幅 ( 画素数 ) 4byte 画像の高さ ( 画素数 ) 2byte プレーンの数 1 2byte 1 画素のビット数 (bpp) 4byte 圧縮形式 : 無圧縮 4byte 画像データのサイズ (byte) 4byte 横方向解像度 4byte 縦方向解像度 4byte パレット数 4byte 重要なパレットのインデックス 撮影 ( デジカメ ) 画像処理するために 本講義での流れ PC へ転送 ( ハードディスク ) 自らのプログラムで画像ファイルを読み込む ( メモリ ) 入力 画像処理 自らのプログラムでメモリ上の画像データを処理 ( メモリ ) 画像データを viewer で開き結果を確認 出力自らのプログラムでメモリ上の画像データをファイルに書き出す ( ハードディスク )

この講義における画像処理 Step1 まず画像を用意する (bmp や jpg) Step2 既存のソフト (paint,xv など ) を使って bmp 形式に変換する ( もともとビットマップであれば変換の必要ないが 以下の条件を満たしていない場合はやはり変換が必要 ) * 画像の幅が 4 の倍数である *1 ピクセルが 24 ビット (24bpp) また 画像を処理して保存する際もこれらの条件が満たされなくてはいけない Step3 p8-1.c に画像処理部分を追加する Step4 既存のソフト (paint,xv など ) を使って保存した画像を開く プログラムで画像を扱う p8-1.cの使い方 p8-1forint.cとp8-1formot.cがある CPUの違いで使い分ける必要がある 使っているCPUがインテル系である (windows Linuxの人はこちらだと思ってよい ) p8-1forint.c 使っているCPUがモトローラ系である (Mac Solaris(sun) の人はこちらだと思ってよい : 大学の情報処理センターで行う人はこっち ) p8-1formot.c プログラムで画像を扱う続き buffer[3*width(height-1)] height buffer[] 3*Width buffer[3*width*height-1] buffer[3*width-1] 1 画素分のデータ () buffer[] buffer[1] buffer[2] buffer[3*width-1] buffer[3*width] buffer[3*width(height-1)] buffer[3*width*height-1] buffer 処理はbuffer 上で行うか out_bufferにデータをコピーしてout_buffer 上で行うもしくは 新たな画像用配列を宣言して使用してもよい但し 書き込みの際は必ずout_bufferに結果の画像データが存在する必要がある ビットマップの読み込み部 (p8-1.c) /* メイン関数 */ int main(void) { int size, width, height; FILE * = NULL; unsigned char *buffer; /* 入力画像用メモリのポインタ */ unsigned char *out_buffer; /* 出力画像用メモリのポインタ */ ITMAPFILEHEADE bmfh; ITMAPINFOHEADE bmih; /* ファイルを開く */ = fopen( "bitmap.bmp", "rb" ); /* ビットマップのヘッダーを読み込む */ /* 構造体のメンバはメモリ上に定義順に確保されていることに注目 */ fread( &bmfh, sizeof(itmapfileheade), 1, ); fread( &bmih, sizeof(itmapinfoheade), 1, ); /* 使いやすいように画像の幅と高さをコピーする */ width = bmih.biwidth; height = bmih.biheight; height out_buffer width ファイル名 result.bmp で保存される size = width * height; /* ビットマップのサイズを算出 */ buffer = (unsigned char*)malloc( 3*size ); /* 必要なサイズのメモリを確保 */ fread( buffer, 3*size, 1, ); /* 画像データ本体の読み込み */ fclose( ); /* 読み終わったのでファイルを閉じる */

ビットマップのための構造体 関数 fread による読み込み /* ビットマップファイルヘッダのための構造体定義 */ typedef struct tagitmapfileheade { unsigned short bftype; unsigned long bfsize; unsigned short bfeserved1; unsigned short bfeserved2; unsigned long bfoffits; } ITMAPFILEHEADE; /* ビットマップインフォヘッダのための構造体定義 */ typedef struct tagitmapinfoheade{ unsigned long bisize; long biwidth; long biheight; unsigned short biplanes; unsigned short biitcount; unsigned long bicompression; unsigned long bisizeimage; long bixpixpermeter; long biypixpermeter; unsigned long biclrused; unsigned long biclrimporant; } ITMAPINFOHEADE; 画像情報のための構造体を定義 windows.h をインクルードできれば その中に定義されているので自分でする必要はない p8-1.c fread 関数を使って ファイルからバイナリデータを直接読み込む fread( コピー先のポインタ, 何バイト読むか, 何個読むか, ファイルポインタ ); fread( &bmfh, sizeof(itmapfileheade), 1, ); fread( &bmih, sizeof(itmapinfoheade), 1, ); ポイントは 構造体を直接読み込んでいることメンバごとに読み込む必要がない メンバがメモリ上に順番に並んでいるため fread( buffer, 3*size, 1, ); 画像データも直接読み込んでいる 14 バイト読んだ次に 4 バイト読む 今ファイルのどこまで読んだかがファイルポインタ に記録されている ビットマップの読み込み 構造体の直接読み込み fread( &bmfh, sizeof(itmapfileheade), 1, ); fread( &bmih, sizeof(itmapinfoheade), 1, ); bmfh の先頭 メモリ fread( &bmfh, sizeof(itmapfileheade), 1, ); ファイルの最後 bmfh の先頭 メモリ fread( buffer, 3*size, 1, ); bmih の先頭 HD bftype 2byte ファイルのタイプ "M" bfsize HD 4byte ファイルのサイズ (byte) bfeserved1 ファイルの先頭 ファイルの最後 buffer[] の先頭 2byte 予約 1 bfeserved2 2byte 予約 2 bfoffits 4byte ITMAPFILEHEADE から実際のビットマップデータまでのオフセット値ヘッダーのサイズと考えてよい (byte)

ビットマップの出力部 (p8-1.c) 関数 fwrite による書き出し /* 書き込み処理 */ /* 結果をファイルに書くためには out_buffer に結果をしまう必要がある */ = fopen( "result.bmp", "wb" ); /* ファイルを書き込み用で開く */ /* 画像の情報を作成する ( 画像処理によって変わる可能性があるものだけ作成 )*/ /* 出力画像の width height が変更されていればそれを書き込む */ bmfh.bfsize = width*height*3 + MP_HEADE_SIZE; bmih.biwidth = width; bmih.biheight = height; 出力はまさに入力の逆 fwrite 関数を使ってバイナリデータを直接ファイルに書き込む /* ビットマップを書き込む */ fwrite( &bmfh, sizeof(itmapfileheade), 1, ); fwrite( &bmih, sizeof(itmapinfoheade), 1, ); fwrite( out_buffer, 3*size, 1, ); fclose( ); /* ファイルを閉じる */ /* メモリを解放する */ free( buffer ); free( out_buffer ); fwrite( &bmfh, sizeof(itmapfileheade), 1, ); fwrite( &bmih, sizeof(itmapinfoheade), 1, ); fwrite( out_buffer, 3*size, 1, ); 14 バイト分書き込んだ後に 4 バイト分書き込みその後に画像サイズ分書き込む } return ; まずは以下をやってみよう これは課題ではないので提出する必要ありませんがまず試すことをお勧めします 好きなビットマップ画像を用意する (24ビットカラー) 画像の幅が4の倍数以上のものは 画像ソフトで4の倍数になるように切り取る p8-1.cをコンパイルし実行する 実行すると新たなビットマップ画像ができるはず 保存したファイルを画像ソフトで開き 入力した画像と全く同じであれば成功 p8-1.cを眺めてみる