• 検索結果がありません。

情報画像工学実験I-1

N/A
N/A
Protected

Academic year: 2021

シェア "情報画像工学実験I-1"

Copied!
35
0
0

読み込み中.... (全文を見る)

全文

(1)

情報画像工学実験I-1

第二週: 画像ファイル

担当: 山口 匡

T A: 松尾  宏 (M1)

宮内 裕輔 (M1)

(2)

レポートについて ( 概要 )

„

提出先:1号棟501室前ポスト

„

期 限:次の実験の開始前まで

„

表 紙:学科所定の表紙

http://www.tj.chiba-u.jp/jikken.html

„

サイズ: A4レポート用(印刷の場合は白紙)

„

製 本:左閉じ(2箇所)

„

Tex, Wordなどのツールを使っての作成が

望ましい ( 手書きの場合,鉛筆書きは不可 )

情報画像工学実験レポート

実験項目: 実験1

実験実施日:

レポート提出日:

提出者:

(3)

レポートについて ( 内容 )

„

実験の目的

„

課題の表題

„

課題の目的

„

ソースプログラム

( コメント文は必須 )

„

指定と異なる点・ 改良点

などの説明

„

課題の考察

„

実験の考察

„

実験1に対する意見・感想

情報画像工学実験レポート

プログラムソース

は2カラム印刷

計算機室で印刷

すること

/* kadai2.c */

#i

ncl

u

de <stdi

o

.h>

左が上になる

ように

じる

(4)

レポートについて ( 注意点 )

„

各課題について,表題から考察までを記載すること

„

追加機能や仕様変更がある場合は,その旨を記載

すること

„

読みやすいプログラムとレポートは好印象

„

サンプルプログラムの丸写しは不可

„

人のプログラムの丸写しも不可

„

必修課題については必ず提出すること

(5)
(6)

バイナリ形式

„

バイナリー(Binary)とは、「0」と「1」の2種類の

数字で表現する2進数の意味

„

2進数で表されたデータ (バイナリー・データ)や

実行形式のプログラム(バイナリー・コード)を

バイナリー形式と言う

„

計算機で扱うデータは、テキスト形式でなければ

バイナリー形式である

(7)

バイナリ形式の長所 ・ 短所

„

長所:

- 保存するデータに制約がない

- 多彩な表現の情報を保存・交換することが可能

( 任意のヘッダ情報を付加することができる )

„

短所:

- ファイルフォーマットが分からないと内容を読む

ことができない

- 互換性に劣る( テキスト形式に比較して )

(8)

バイナリデータとは ( 8 bitの例 )

00

08

54

04

09

49

3C

10

38

46

2F

21

3F

0B

01

39

19

0E

41

60

56

3B

59

57

FF

0

8

84

4

9

73

60

16

56

70

47

33

63

11

1

57

25

14

65

96

86

59

89

87

255

00000000

00001000

01010100

00000100

00001001

01001001

00111100

00010000

00111000

01000110

00101111

00100001

00111111

00001011

00000001

00111001

00011001

00001110

01000001

01100000

01010110

00111011

01011001

01010111

11111111

10進数 : 人が理解しやすい

16進数 : 計算機が考えやすい

2進数 : 実際のメモリ内容

8 bit = 1 byte

2進数を示す箱が

8個(8桁分)ある

0 ~ 255を表現

できる

(9)

バイナリデータとは ( 8 bitの例 )

73 60

4

9

3

C

0

1

0

0

1

0

0

1

0

0

1

1

1

1

0

0

10進数

16進数

2進数

0x49 = 4×16

1

+9×16

0

= 73

01001001 = 0×2

7

+ 1×2

6

+ 0×2

5

+ 0×2

4

+ 1×2

3

+ 0×2

2

+ 0×2

1

+ 1×2

0

= 73

= 0x ( 0×2

3

+ 1×2

2

+ 0×2

1

+ 0×2

0

),

0x ( 1×2

3

+ 0×2

2

+ 0×2

1

+ 1×2

0

)

= 0x 49

下位のデータ

上位のデータ

最下位のデータ

最上位のデータ

(10)

fread/ fwrite関数

fread( buf, サイズ, カウント, fp);

・引数に指定したファイルポインタの初期位置から

サイズ( byte単位 )毎にカウント( 最大値 )まで

データを読み込む

・実際に読み込まれたデータの数を返す

例.

size = fread( buf, sizeof(long), 100, fp);

※ intやlongなど,計算機環境によってサイズ( byte数 )が

異なることがあるため,sizeof演算子でデータ型の大きさ

(バイト単位)を計算するのがよい

fwrite( buf, サイズ, カウント, fp);

・引数に指定したファイルポインタの初期位置から

サイズ毎にカウントまでデータを書き込む

(11)

例題: 簡単な画像を扱ってみる

(0,0)

(0,31)

(31,0)

(31,31)

„

32画素×32画素の二次元画像

がバイナリ形式で保存されている

imgsample.img

)

„

各画素の中身はchar型

0

1 byte 125 のいづれか

255

„

fread関数を使って一次元の配列

にデータを読み込む

は1画素をあらわしている

(12)

例題: 簡単な画像を扱ってみる

/*

img_read.c

*/

#include <stdio.h>

int main(void)

{

FILE *fp;

char data[2000];

/* ファイルから読み込むデータを格納 */

if(( fp = fopen( “imgsample.img", "rb" )) == NULL ){

puts( "入力ファイルが見つかりません" );

return (1);

}

fread( data, 1, 32*32 , fp );

/* 2次元のデータを一次元配列に */

/* 1byte ( 1画素,1文字 )ずつ読み込み */

fclose( fp );

/* dataには画像データが保存されているので、各種の処理ができる */

return (0);

}

(13)

例題: 簡単な画像を扱ってみる

00000000000000000000000000000000 000-10000000-100000000000000000000 000-10000000-100000000000000000000 000-10000-1-1-1-1-1-1-100000000000000000 000-10000000-100000000000000000000 000-10000000-100000000000000000000 000-10000-1-1-1-1-1-1-100000000000000000 0-10-10-100000-100000000000000000000 0-10-10-100000-100000000000000000000 0-10-10-10-1-1-1-1-1-1-1-1-10000000000000000 0-10-10-100000000000000000000000000 0-10-10-100-1-1-1-1-1-1-100000000000000000 0-10-10-100-100000-100000000000000000 000-10000-100000-100000000000000000 000-10000-1-1-1-1-1-1-100000000000000000 000-10000-100000-1001251251251251251251251251251251250000 000-10000-100000-10000000125000000000 000-10000-1-1-1-1-1-1-10000000125000000000 000-10000-100000-1001251251251251251251251251251251250000 000-10000-100000-100125000012500001250000 00000000000000000125000012500001250000 00000000000000000125000012500001250000 0000000000000012500125125125125125125125125125125125001250 000000000000001250012500001250000125001250 000000000000001250012500001250000125001250 000000000000001250012500001250000125001250 0000000000000012500125125125125125125125125125125125001250 000000000000001250000000000000001250 000000000000001250000000000000001250 000000000000001251251251251251251251251251251251251251251251251250 00000000000000000000000000000000 00000000000000000000000000000000

dataの中身を元通りに

二次元に並び替えて

10進数のテキストで表示

すると左のようになります

どのような画像なのか

分かりませんね

※この出力結果は、計算機

環境によって異なります

(14)

例題: 簡単な画像を扱ってみる

プログラム img_read.c を改良し、

dataに読み込まれたデータのうち、

0 を ‘ ’ ( 半角スペース )

125 を ‘&’ ( 半角アンド )

それ以外 を ‘@’ ( 半角アットマーク )

で表現して標準出力に表示するとプログラムを

作成しなさい

※1: 一次元の配列を二次元のように扱うためには

data[ ]の添え字をどうすればよいのか?

※2: 記号を全角にすると2byte使ってしまうので注意

(15)
(16)

課題3: BMPファイルの入出力

„

24 bit ( 1677万色 )のWindows Bitmap形式で保存

された画像ファイル

bmpsample.bmp

を読み込み,

Red,Blue,Greenのいづれかの色情報のみを残し

て他の色情報を排除した画像を作成しなさい

„

bmpsample.bmpの画像サイズ( 縦×横の大きさ )

はヘッダ情報を読み込むことで認識しなさい

„

作成するファイルは縦 ・ 横の画素数および色数

が元画像と同じままのWindows Bitmap形式とする

(17)

元の画像

Redだけ

Blue+Green

Green

だけ2倍

(18)

参考資料

(19)

BMPファイル全体の構造

BMP フォーマットはヘッダの種類によって Windows Bitmap と OS/2 Bitmap

の2種類に分けられる。これらの2つのフォーマットは,ヘッダのサイズが

異なっている。

BMP ファイル全体 の構造

ファイルヘッダ

BITMAPFILEHEADER (14byte)

情報ヘッダ

BITMAPINFOHEADER (Windows)

または

BITMAPCOREHEADER (OS/2)

+

カラーパレット(1, 4, 8 bit の場合必要)

画像データ

※ カラーパレーットがない場合、各画素に割り振られた値は

そのまま色(または明るさ)を示す。

カラーパレットがある場合は、各画素の値はパレットを参照

するための値であり、色(または明るさ)はパレットで定義

されたものとなる。

(20)

ファイルヘッダ

[BITMAPFILEHEADER]

最初に

14 byte 固定

のファイルヘッダ部分がある。

最初の 2 byte が

“BM”

かどうかで、ビットマップファイルが識別される。

BITMAPFILEHEADER

bfType

2

byte

ファイルタイプ

'BM' - OS/2, Windows

Bitmap

bfSize

4

byte

ファイルサイズ (byte)

bfReserved1

2

byte

予約領域

常に 0

bfReserved2

2

byte

予約領域

常に 0

bfOffBits

4

byte

ファイル先頭から画像データま

でのオフセット (byte)

(21)

情報ヘッダ < Windows >

[

BITMAPINFOHEADER

]

BITMAPINFOHEADER (1)

biSize

4 byte

情報ヘッダのサイズ (byte)

40 byte

biWidth

4 byte

画像の幅 (ピクセル)

biHeight

4 byte

画像の高さ (ピクセル)

biHeight の値が正数なら,画像データは

下から上へ

biHeight の値が負数なら,画像データは

上から下へ

biPlanes

2 byte

プレーン数

常に 1

biBitCount

2 byte

1 画素あたりのデータサイズ (bit)

1 - 2 色ビットマップ

4 - 16 色ビットマップ

8 - 256 色ビットマップ

16 - 65536色(high color)ビットマップ

24 - 1677万色(true color)ビットマップ

32 - 1677万色(true color)ビットマップ

biCopmression

4 byte

圧縮形式

0 - BI_RGB (無圧縮)

1 - BI_RLE8 (RunLength 8 bits/pixel)

2 - BI_RLE4 (RunLength 4 bits/pixel)

3 – Bitfields

(22)

情報ヘッダ < Windows >

[

BITMAPINFOHEADER

]

BITMAPINFOHEADER (2)

biSizeImage

4 byte

画像データ部のサイズ (byte)

96dpi ならば3780

0 の場合もある

biXPixPerMeter

4 byte

横方向解像度 (1mあたりの画素

数)

96dpi ならば3780

0 の場合もある

biYPixPerMeter

4 byte

縦方向解像度 (1mあたりの画素

数)

96dpi ならば3780

0 の場合もある

biClrUsed

4 byte

格納されているパレット数 (使用

色数)

0 の場合もある

biCirImportant

4 byte

重要なパレットのインデックス

0 の場合もある

(23)

情報ヘッダ < OS/2 >

[

BITMAPCOREHEADER ]

BITMAPCOREHEADER

biSize

4 byte

情報ヘッダのサイズ (byte)

12 byte

bcWidth

2 byte

画像の幅 (ピクセル)

bcHeight

2 byte

画像の高さ (ピクセル)

bcHeight の値が正数なら,画像データは

下から上へ

bcHeight の値が負数なら,画像データは

上から下へ

bcPlanes

2 byte

プレーン数

常に 1

bcBitCount

2 byte

1画素あたりのデータサイズ (bit)

1 - 2 色ビットマップ

4 - 16 色ビットマップ

8 - 256 色ビットマップ

16 - 65536色(high color)

24 - 1677万色(true color)ビットマップ

32 - 1677万色(true color)ビットマップ

(24)

Windows BMP 24bit の構成

42 4D

BITMAPFILEHEADER ( 14 byte )

BITMAPINFOHEADER ( 40 byte )

Data ( 任意のサイズ )

0x42 が ‘B’ をあらわす

0x4D は?

は1 byte を示しているおり,16進数で表記している。実際は

8個のメモリに2進数で保存されている

実際には

(25)

Windows BMP 24bit のデータ構造

(31,0)

(31,31)

(0,0)

(0,31)

„

32画素×32画素のWindows BMP

„

画像データは基本的に左下から

右上へ向かって並んでいるので、

モニタに表示されるものとは並び順

が異なる

( BITMAPINFOHEADER の biHeight で決まる )

„

各画素は Blue (8bit), Green (8bit),

Red (8bit) の 3 byteで表現される。

たとえば、この画素(5,30)が白で、(5,31)が

黒だとすると

FF

FF

FF

00

00

00

(5,30)

(5,31)

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

(16進数)

(2進数)

実際の計算機に保存されているのは

は1画素をあらわしている

(26)

ヘッダを読み込む際の注意事項

例.BITMAPINFOHEADER の biSize : 情報ヘッダのサイズ

・ Windows BMP の場合、biSize の値は常に

40 byte

・ biSize は

4 byte

で保存されている

下のように temp_long に 4 byte を読み込んでみると

long temp_long;

fread ( &temp_long, 4, 1 , fpr ); /* 情報ヘッダサイズ */

long infohead_size = temp_long;

← 40.0

10進数の40を、4 byte の16進数で表現すると

0x00000028

( 2×16 + 8 = 40)

計算機の中では右図のように

格納されている

( Intel系の計算機など )

28

00

00

00

上位データ

下位データ

(27)

ヘッダを読み込む際の注意事項

long temp_long;

fread ( &temp_long, 4, 1 , fpr );

temp_long の中身は

0x00000028

・・・ ①

であれば問題ないのだが・・・

右図のように認識する計算機もある

( Motorola系の計算機 )など

この場合の tmp_long の中身は

0x28000000

・・・ ②

こんなに違う

①: 0x00000028 = 40 )

10

②: 0x28000000 =671088640 )

10

28

00

00

00

上位データ

下位データ

下位データ

上位データ

次の

データ

前の

データ

28

00

00

00

データ

次の

前の

データ

(28)

エンディアン

0x0123ABFF

リトルエンディアン

上位データ

0x0123ABFF

ビッグエンディアン

FF

AB

23

01

上位データ

下位データ

下位データ

上位データ

処理( 書込 )の順番

処理( 書込 )の順番

次の

データ

前の

データ

01

23

AB

FF

データ

次の

前の

データ

< 計算機室のシステムはこちらに準拠 >

< 今回使うBMPファイルはこちらに準拠 >

たとえば 0x0123ABFF を格納する場合に、2つの方式がある。

(29)

エンディアンが異なると

上下のbyteで中身を入れ替えないと、正しい値を得られない。

リトルエンディアンのつもりで作られたヘッダ情報が

28

00

00

00

上位データ

下位データ

次の

データ

前の

データ

28

00

00

00

次の

データ

前の

データ

下位データ

上位データ

ビックエンディアンで認識されている!

こうすると、

long temp_long;

fread ( &temp_long, 4, 1 , fpr );

⇒ 0x28000000 になってしまうので

(30)

おまけ

int origin : SEEK_SET (ファイルの先頭)

SEEK_CUR (ファイルの現在位置)

SEEK_END (ファイルの終端)

fseek関数

fseek ( fp, offset, int origin );

・ 引数に指定したファイルポインタの初期位置

originを基準として,offsetだけ移動する。

(31)
(32)

発展課題1: 三角形 ・ 四角形の面積を求める

次のようにPoint型が与えられているとする。

typedef struct point {

int x;

int y;

} Point;

このとき,3点が引数として指定されたときにその3点を

三角形の頂点とみなし,三角形の面積を求める関数を

作成しなさい。

関数は次のようなプロトタイプ宣言を持つものとする。

double TriArea( Point, Point, Point );

(33)

発展課題1: 三角形 ・ 四角形の面積を求める

さらに拡張し,4点が引数として指定されたときに

その4点を四角形の頂点とみなし,四角形の面積を

求める関数も作成しなさい。

関数は次のようなプロトタイプ宣言を持つものとする。

double SquArea( Point, Point, Point, Point );

(34)
(35)

発展課題2: 拡張版BMP入出力

課題3で作成したプログラムを任意に拡張する

例)

ƒ

画像を反転・回転

ƒ

任意の色を強調

ƒ

任意の位置を切り出し

ƒ

24 bit に限らず,8 bit, 32 bitなどにも対応

( カラーパレットについて調べる必要あり )

ƒ

OS/2 Bitmapにも対応

ƒ

画像フィルタの適用

など

参照

関連したドキュメント

分からないと言っている。金銭事情とは別の真の

 よって、製品の器種における画一的な生産が行われ る過程は次のようにまとめられる。7

ともわからず,この世のものともあの世のものとも鼠り知れないwitchesの出

90年代に入ってから,クラブをめぐって新たな動きがみられるようになっている。それは,従来の

仏像に対する知識は、これまでの学校教育では必

Instagram 等 Flickr 以外にも多くの画像共有サイトがあるにも 関わらず, Flickr を利用する研究が多いことには, 大きく分けて 2

ヒュームがこのような表現をとるのは当然の ことながら、「人間は理性によって感情を支配