プログラミング演習Ⅱ 課題 4 第 2 週 画像ファイル (ppm) の読み書き 画像データ用のメモリ確保・解放 1.

Slides:



Advertisements
Similar presentations
10: ファイル入出力 Linux にログインし、以下の講義ページ を開いておくこと teachers/w483692/CPR1/ C プログラミング入門 総機 1 ( 月 1) 1.
Advertisements

プログラミング 関数編 情報科学科. プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる.
1 全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える 処理後のデータを出力ファイルに書き出す 画像データ用に確保したメモリを解放.
画像情報処理 1 プログラミング課題 知的画像処理研究室 M2 大村 瑞穂. 目次 プログラミング課題の準備 – ファイルのダウンロード・解凍・コンパイル サンプルプログラムの説明 画像処理の方法 レポートに載せる画像について 例題と第 1 回レポート課題.
画像情報処理1 ~画像処理プログラミング~ 2015/05/01 知的画像処理研究室 M1 吉原寛樹
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第13回構造体.
第12回構造体.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
アルゴリズムとデータ構造 2011年6月13日
問題 1 キーボードから入力した数の合計を計算するプログラムを 作成せよ。最初に、何個の数を入力するかその数を入力 するようにする。
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
画像ファイル(ppm)の読み書き 画像データ用のメモリ確保・解放
2014/05/02 知的画像処理研究室 M1 中津美冴 画像情報処理1 ~画像処理プログラミング~ 2014/05/02 知的画像処理研究室 M1 中津美冴
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
10: ファイル入出力 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
補足説明.
Cプログラミング演習.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
iioLoadFile()とiioMallocImageBuffer()の補足
Cプログラミング演習 第7回 メモリ内でのデータの配置.
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
画像処理プログラムの説明.
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング演習Ⅱ 課題4第3週 画像処理 (1) ビット演算子.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
デジタル画像とC言語.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
第4回 ファイル入出力方法.
型の compatibility とポインタ演算
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
画像処理プログラミング 知的画像処理研究室 M2 小林 佳奈美.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
アルゴリズムとデータ構造 2012年6月11日
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
R8C I/Oポートの仕組み SFR定義ファイルの中身.
第5回 プログラミングⅡ 第5回
プログラミング演習Ⅱ 課題4第4週 画像処理 (2) 応用.
extern の意味 (C プログラミング演習,Visual Studio 2019 対応)
モジュール分割.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
マスク合成(のような処理) 出力画像 Out 入力画像1 In1 In1 In2 Out 入力画像2 In
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

プログラミング演習Ⅱ 課題 4 第 2 週 画像ファイル (ppm) の読み書き 画像データ用のメモリ確保・解放 1

B1B2B3 B4B5B6 B7B8B9 G1G2G3 G4G5G6 G7G8G9 画像データの基礎 2 画素ごとの明るさを数値で表現 (8bit なら 0 から 255) カラー画像は各画素に Red, Green, Blue (R,G,B)= (255, 0, 0): 赤, (255, 255, 255): 白 raw 画像ファイルでは 1 次元上に数値が並んでいる R1G1B1R2G2B2...B3R4G4... ファイル上の画像データの並び R1R2R3 R4R5R6 R7R8R9

PPM 画像ファイル 3 画像に関する情報をヘッダとして持っている 今回使用する画像データは R,G,B 各 8 ビット P6 # Created by IrfanView [ ここから画像データ ]..... PPM ファイルの中身 マジックナンバー ( バイナリ PPM, 固定 ) # から改行まではコメント文 横方向の画素数 [ 空白 ] 縦方向の画素数 最大輝度 [ ここから画像データ ]..... 解説 R1G1B1R2G2B2...B3R4G4... 8bit 24bit

4 データ構造 ~画像データをどう表現するか~ 画像ファイルのフォーマット ヘッダ ( 画像サイズ,最大輝度 ) 画像データ 88 (136) B1 (177) E7 (231) int xsize; int ysize; int level; unsigned char r1, g1, b1, r2... プログラムでデータを読み込む場合・・・ ・画像 1 つに対し変数がいくつも必要 → 構造体でまとめ る ・画像データの配列サイズはヘッダを読むまで決められ ない → メモリの動的確保・解放

5 データ構造 ~構造体定義~ 画像ファイルのフォーマット ヘッダ ( 画像サイズ,最大輝度 ) 画像データ 88 (136) B1 (177) E7 (231) typedef struct { int xsize; int ysize; int level; PIXEL **pBuffer; } IMAGE; ヘッダ 画像データへの二重ポイン タ typedef struct { unsigned char r; unsigned char g; unsigned char b; } PIXEL; 画像データ (1 画素分 )

6 データ構造 ~構造体定義~ 画像ファイルのフォーマット ヘッダ ( 画像サイズ,最大輝度 ) 画像データ 88 (136) B1 (177) E7 (231) typedef struct { int xsize; int ysize; int level; PPIXEL *pBuffer; } IMAGE; typedef struct { unsigned char r; unsigned char g; unsigned char b; } PIXEL, *PPIXEL; (PIXEL*) 型として PPIXEL を新たに定義

7 ポインタの配列 ~画像バッファの確 保~ void iioMallocImageBuffer(IMAGE *pImage) xsize ysize level pBuffer xsize 個の PIXEL の配列を確保 malloc(xsize * sizeof(PIXEL)); pImage ysize 個の PPIXEL の配列を確保 malloc(ysize * sizeof(PPIXEL));

8 画像バッファの様子 ysize 個 xsize 個 xsize ysize level pBuffer pImage → i→ i ↓j↓j pImage->pBuffer[0][0] ↓j↓j → i→ i pImage->pBuffer[j][i] pImage->pBuffer[j]

画像へのアクセス方法 9 IMAGE *pImage; /* pImage に画像データを読み込んだ後と仮定する */ pImage->xsize; /* int 型,画像幅 */ pImage->ysize; /* int 型,画像高さ */ pImage->pBuffer[j][i]; /* PIXEL 型,位置 (i,j) における {R,G,B}*/ pImage->pBuffer[j][i].r; /* unsigned char 型 */ /* 位置 (i,j) における R の値 */ pImage->pBuffer[j]; /* PPIXEL 型, (j) 行の画素値が連続で格納されて /* いる場所の先頭アドレス */

モジュール設計について 10

11 モジュール設計 利点 : 可読性,分割コンパイル,情報の隠 ぺい モジュールごとの独立性を高めるように設 計 メイン main.c 画像処理 img_proc.c img_proc.h 画像のファイル入出力 画像データ用メモリ確保と解放 img_io.c img_io.h

12 関数プロトタイプ宣言 double func(double d); int caller(void) { f = func(4); } double func(double d) { return d*2; } 関数呼出部分より前に プロトタイプ宣 言 を行う 最後はセミコロ ン あるファイル内で定義した関数 (func) を,定義し ている位置より前で呼び出したい場合 プロトタイブ宣言がないと, func 関数は未定義エラー func 関数の定義部

13 ヘッダファイルの利用 #include “module.h” // 呼び出される関数 double func(double d) { return d*2; } module.c #include “module.h” // 呼び出し側関数 int caller(void) { f = func(4); // 関数呼び出 し } caller.c // プロトタイプ宣言 double func(double d); module.h ヘッダファイル ” ” で囲んでいる ことに注意! あるファイル内で定義した関数 (func) を,違う ファイルで呼び出したい場合 関数のプロトタイプ宣言をヘッダファイルに記述 呼び出し側のファイルで #include

14 と " " #include のように で囲まれて いると,プリプロセッサはシステムで定められた 場所にあるファイルを取り込む #include “module.h” のように ” ” で囲まれて いると,まずプログラムファイルと同じ場所を探 し,存在しない場合はシステムで定められた場所 を探す

15 モジュール化の基本 #include #include “module.h” int internal_func(int a); #define INT_MACRO(a) (…) static int internal_func(int a) { // モジュール内で // 使用する関数 } module.c module.h void exported_func(int i) { // 外部に公開する関数 } ヘッダファイルには 外部に公開する情報のみを記述 関数のプロトタイプ宣 言 typedef 型宣言 #define マクロ定義 など プロトタイプ宣言が関数本体と一 致するように注意 モジュール内のみで使用する関数 のプロトタイプ宣言やマクロ定義 などはモジュール内で行う モジュールで,何を公開し, 何を隠すかがポイント #define MAX 1024 typedef unsigned char BYTE; void exported_func(int i);

16 ファイルを分割したときの関数のス コープ × ○ #include #include “module.h” int internal_func(int a); #define INT_MACRO(a) (…) static int internal_func(int a) { // モジュール内で // 使用する関数 } module.c module.h void exported_func(int i) { // 外部に公開する関数 } #define MAX 1024 typedef unsigned char BYTE; void exported_func(int i); 別のモジュール #include “module.h” exported_func(15); internal_func(30); foo.c ヘッダファイルにプロトタイプ宣言がない 関数は外部から参照できない static な関数は外部から参照できない

サンプルプログラム 2 につい て 17

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

19 img_io.c 画像ファイルのロード ファイルオープン 画像バッファ確保 データコピー ファイルクローズ 画像ファイルのセーブ 画像バッファ確保 画像バッファ解放 サンプルプログラム 2 の関数呼び出し 関係 main.c 画像ファイルをロードする関数を呼び出す 画像処理関数を呼び出す 画像ファイルをセーブする関数を呼び出す 画像バッファを解放 img_proc.c 画像を 90 度回転 作業用バッファを確保 データを移し変え 不要なバッファを解放 ( あとで処理を追加したい ) etc

20 img_io.c 画像ファイルのロード ファイルオープン 画像バッファ確保 データコピー ファイルクローズ 画像ファイルのセーブ 画像バッファ確保 画像バッファ解放 サンプルプログラム 2 の実装状況 main.c 画像ファイルをロードする関数を呼び出す 画像処理関数を呼び出す 画像ファイルをセーブする関数を呼び出す 画像バッファを解放 img_proc.c 画像を 90 度回転 作業用バッファを確保 データを移し変え 不要なバッファを解放 ( あとで処理を追加したい ) etc 実装済 演習課題 実装済 演習課題 ( 第 3 週以降 )

21 関数の設計 ファイル入出力 (済) int iioLoadFile(IMAGE *pImage, const char *fname); (未) int iioSaveFile(IMAGE *pImage, const char *fname); メモリ確保 / 解放 (済) void iioMallocImageBuffer(IMAGE *pImage); (未) void iioFreeImageBuffer(IMAGE *pImage); 画像処理関連 (済) void ipRotateImage(IMAGE *pImage);

第 2 週目の目標 画像ファイルを読み込み 90° 回転させた後, 画像ファイルを出力するプログラムを作成す る 読み込み関数や回転処理関数は既に実装済み 画像ファイルをセーブする関数 ”iioSaveFile” と 画像バッファを解放する関数 ” iioFreeImageBuffer” を完成させる 22

23 画像ファイルのセーブのヒン ト 出力用ファイルを バイナリモードでオープン ヘッダ情報を出力 画像データを出力 ファイルクローズ 開始 終了 int iioSaveFile(IMAGE *pImage, const char *fname) xsize ysize level pBuffer pImage pBuffer[0] pBuffer[1] pBuffer[2] 一行ずつ出力 ヒント: fwrite ヒント 1: fprintf ヒント 2: xsize の後ろに空白 1 つ ysize の後ろに改行 level の後ろに改行 を忘れない

24 画像バッファの解放のヒント void iioFreeImageBuffer(IMAGE *pImage) pBuffer を解放 ② 開始 終了 j < ysize? xsize ysize level pBuffer pImage pBuffer[0] pBuffer[1] pBuffer[2] ① 一行ずつ解放 ②最後に各行へのポイ ンタの配列を解放 pBuffer[ j ] を解放 ① j++; j =0; Y N