...

Processingによる画像処理

by user

on
Category: Documents
3

views

Report

Comments

Transcript

Processingによる画像処理
グラフィックスの世界 第6回
サイバーメディアセンター
サイバーコミュニティ研究部門 安福 健祐
Processingによる画像処理
 デジタル画像について
– ピクセルと色情報
– ベクターとラスター
 デジタルデータについて
– 2進数と16進数
– ビットとバイト
 画像処理の例
– ピクセル加工(モノトーンなど)
Processingによる画像ファイル表示
 画像ファイルの読み込み
PImage img;
void setup()
{
img = loadImage("sample.jpg");
size(img.width, img.height);
noLoop();
}
void draw()
{
image(img, 0, 0); // 元の画像
}
デジタル画像
 デジタル画像は、ディスプレイやプリンタから出力されるとき、
画素 (ピクセル) と呼ばれる点(ドット)の集合になっている
 画素は2次元格子状に配置される
 (横方向の画素数)×(縦方向の画素数)画素の画像と呼ばれる
512×512(262,144)画素の画像
64×64(4,096)画素の画像
階調
 各画素は明るさの情報を持つ
– 明るさは最も明るい状態と真っ暗な状態を何段階で表現するか
によって何階調と呼ばれる
2階調
暗い
明るい
16階調
256階調
画素の色
 RGBカラー
– 赤(Red)、緑(Green)、青(Blue)の光の3原色
– 3原色がそれぞれ階調を持ち、加法混色であらゆる色が表現できる
– テレビやコンピュータディスプレイに使用されている
256階調
256×256×256=16,777,216
理論上、約1677万色が表現できる
画素の色
 CMYKカラー
–
–
–
–
シアン(Cyan)、マゼンタ(Magenta)、イエロー(Yellow)の色の3原色
3原色がそれぞれ階調を持ち、減法混色であらゆる色を表現する
カラープリンタに利用される
3原色を混合すると理論上は黒になるが、化学的に純度100%にはでき
ないため、実際のインクはブラック(K)を合わせて使う
Y
K
M
C
画素の色
 HSB(HSV)
– 色相(Hue)、彩度(Saturation)、明度(Brightness, Value)の3属性
– 人が任意の色を選択しやすいため、グラフィックスソフトの色選択で
よく用いられる
– RGBとは非線形変換になる
Brightness
Saturation
Hue
ProcessingのColor Selector
 Processingにおける色指定方法はRGBまたはHSBを使う
データ方式の種類
データ
方 式
ラスタ(ビットマップ)
ベクタ
特
画素の集合で表す。
パラメータを数値で表す。
各画素の色情報
線の起終点の位置座標
曲線であればその曲がり方
線の太さ・色
線に囲まれた面の色
それらの変化のしかた 等
具体例
デジカメの写真
イラストデータ
CADの図面データ
編集用
ソフト
Adobe Photoshop
Painter
Adobe Illustrator
AutoCAD
徴
ラスタデータ
Adobe Photoshop写真画像を編集
ラスタデータ
拡大すると画素の集合と分かる
Adobe Photoshop写真画像を編集
ベクタデータ
Adobe Illustratorでイラスト画像を編集
ベクタデータ
拡大しても滑らか
但し、ディスプレイはラスターイメージしか表示できないので、ベクターイメージを表
示する際は、必要な解像度にラスタライズして表示していることになる。
デジタル画像の種類
データ
方 式
ラスタ(ビットマップ)
ベクタ
特
画素の集合で表す。
パラメータを数値で表す。
各画素の色情報
線の起終点の位置座標
曲線であればその曲がり方
線の太さ・色
線に囲まれた面の色
それらの変化のしかた 等
具体例
デジカメの写真
イラストデータ
CADの図面データ
編集用
ソフト
Adobe Photoshop
Painter
Adobe Illustrator
AutoCAD
徴
☆ 最終的にディスプレイへ出力される画像はビットマップ
デジタルデータ
 デジタル画像処理を理解するため、コンピュータ内部で画像データ
がどのような形式で表され、どのような方法で演算されているかを
知ることが重要
 コンピュータ内部ではすべて2進数の値として取り扱われる
– コンピュータの部品「IC」
– ICはピン1本で二つの状態しか表せない(電流が流れるor流れない)
IC
32ビット は情報を入出力するためのピンが32本あるイメージ
ビットとは?
 情報の最小単位「ビット」
– 「0」と「1」、「ある」か「ない」
– 1ビット=2進数の1桁
• 1001 0101 0010 1010 → 16ビット
– 1ビット増えるごとに2倍の情報が区別できる
• 1ビット:2通り
• 2ビット:4通り
• 3ビット:8通り
・・・
• 8ビット:256通り, 16ビット:65536通り, 32ビット:4294967296通り
 「すべての情報はビットに置き換えることができる」(シャノン)
• 数字(10進数→2進数)
• 文字
• 音、映像
• 物理現象、ヒト?
マジックナンバー「8ビット」
 コンピュータの世界では8ビットが重要な意味を持つ
– 英文字1文字を8ビットで表現した
• アルファベット大文字・小文字:52種類
• その他の記号
• 8ビットが2の3乗なのでなにかと都合がよい
 8ビット=1バイト
– 8桁の2進数のことを「バイト(byte)」と呼ぶ
– 1バイトは情報の基本単位
• USBメモリなどにはバイト単位でデータを保存する
1024バイト
= 1キロバイト(KB)
1024キロバイト
= 1メガバイト(MB)
1024メガバイト
= 1ギガバイト(GB)
1024ギガバイト
= 1テラバイト(TB)
2進数と16進数
 2進数
– ビット単位のデータを表すのに便利
– 桁数が多くなり見づらい
 16進数
– 2進数の4桁(4ビット)が16進数の1桁に相当(1バイトは16進数2桁)
– 変換が10進数より簡単
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
(例)24ビットの16進数(9A9D34)
1001 1010 1001 1101 0011 0100
9
A
9
D
3
4
2進数と16進数
 RGBカラーなどの表記には
16進数がよく使われる
–
–
–
–
R=12 (#0C)
G=245 (#F5)
B=118 (#76)
RGB = #0CF576
 16進数(1000)のいろんな表記方法
–
#1000, 0x1000, 1000h,
文字のデジタル化
http://www.sugilab.net/jk/joho-kiki/2106/index.html
アナログとデジタル
 アナログとデジタル
– アナログ
• コード化されてない情報(レコード、ビデオテープ)
• 連続的で切れ目がないのデータ
– デジタル
• デジタル:コード化された情報(CD, DVD)
• 不連続でとびとびのデータ
数値データに変換(量子化)
音のアナログ波形
0
0
1/44100秒でサンプリング
CDの構造
http://www.sugilab.net/jk/joho-kiki/1509/
CDにレーザ光を当てて、その反射光を検出してデータを読み出す。
・記録層にピットなし
・記録層にピットあり
→
→
光を反射する
光を反射しない
→
→
1
0
CDが回転することで0と1の羅列(ビットデータ)を検出できる
デジタル画像のデータサイズ計算
規格
画素数
用途
サイズ
VGA
640×480
(約30万)
だいぶ昔のPC
900Kバイト
NTSC
720×480
(約35万)
DVD
1Mバイト
XGA
1024×768 (約80万)
ちょっと昔のPC
2.25Mバイト
SXGA
1280×1024(約130万)
最近までのPC
3.75Mバイト
HDTV
1920×1080(約200万)
フルHDテレビ
5.93Mバイト
 1画素あたり3バイト(RGB=各1バイト=256階調)
 1000万画素のデジカメ→3000万バイト→30Mバイト!?
– JPEG形式で保存するとサイズは1/10ほどになる(非可逆圧縮)
– RAW形式(非圧縮か可逆圧縮)
データ圧縮の考え方
 可逆圧縮
– (例)ランレングス圧縮
• 同じ文字が続くと続いた数に置き換える
• 文字列圧縮前「RRRRRRABDDDDDGG」(15文字)
• 文字列圧縮後「R6ABD5G2」(8文字)
– 圧縮前に戻しても(解凍)データは全く同じ(可逆)
– 圧縮率はそれほど高くない(1/2程度?)
 非可逆圧縮
– (例)JPEG圧縮
• 画像を8x8のブロックに分けて離散コサイン変換により周波数領域に変換
• 量子化によって情報量を落とし、ハフマン符合により圧縮
– 圧縮前に戻しても(解凍)データは全く同じにならない(非可逆)
– 圧縮率は高い(1/10程度?)
画素数と解像度
 解像度=1インチあたりの画素数
– iPhone4の場合
• 画素数は960x640
• 画面サイズは3.5インチ(3x2インチ)
• 解像度は300dpi以上
– 32インチTVの場合
• 画素数は1920x1080
• 画面サイズは32インチ(約27.9インチx15.7)
• 解像度は約70dpi
– プリンタで印刷するとき
• 解像度300dpi
• 用紙サイズ(A4)は297 x210cm(約11.7 x8.2 インチ)
• 画素数は約3510 x 2460
Processingによる画像ファイル表示
 画像ファイルの読み込み
PImage img;
void setup()
{
img = loadImage("sample.jpg");
size(img.width, img.height);
noLoop();
}
void draw()
{
image(img, 0, 0); // 元の画像
}
Processingによる画像処理
img.width (8)
 ピクセル=配列データ
データ配列
#909090
#909090
#e5adcc
#909090
img[0]
img[1]
img[2]
img[3]
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
・・・・・・・・・
#909090
img[63]
img.height
(8)
Processingによる画像処理
 ピクセルの操作1(赤成分のみを表示)
PImage img;
void setup()
{
img = loadImage("sample.jpg");
size(img.width, img.height);
noLoop();
}
void draw()
{
color c;
img.loadPixels();
int n = img.width * img.height;
for ( int i = 0; i < n; i++) {
c = img.pixels[i];
img.pixels[i]=color(red(c), 0, 0);
}
image(img, 0, 0); // 元の画像
}
Processingによる画像処理
img.width (8)
 ピクセル=配列データ
データ配列
#909090
#909090
#000000
#909090
img[0]
img[1]
img[2]
img[3]
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
・・・・・・・・・
#909090
img[63]
img.height
(8)
Processingによる画像処理
 ピクセルの操作2
PImage img;
void setup()
{
img = loadImage("sample.jpg");
size(img.width, img.height);
noLoop();
}
void draw()
{
img.loadPixels();
for ( int y = 0; y < img.height; y++) {
for ( int x = 0; x < img.width; x++) {
int i = x + y*img.width;
if(y%2==0) img.pixels[i] = color( 0,0,0 );
}
}
image(img, 0, 0); // 元の画像
}
Processingによる画像処理
 ピクセル=配列データ
0
1
2
3
4
5
6
7
0
0
1
2
3
4
5
6
7
1
8
9
10
11
12
13
14
15
2
16
17
18
19
20
21
22
23
3
24
25
26
27
28
29
30
31
4
32
33
34
35
36
37
38
39
5
40
41
42
43
44
45
46
47
6
48
49
50
51
52
53
54
55
7
56
57
58
59
60
61
62
63
y
データ配列
#909090
#909090
#909090
#909090
img[22]
img[23]
img[24]
img[25]
・・・・・・・・・
#909090
#909090
img[31]
img[32]
x
Processingによる画像処理
 ピクセル=配列データ
0
1
2
3
4
5
6
7
0
0
1
2
3
4
5
6
7
1
8
9
10
11
12
13
14
15
2
16
17
18
19
20
21
22
23
3
24
25
26
27
28
29
30
31
4
32
33
34
35
36
37
38
39
5
40
41
42
43
44
45
46
47
6
48
49
50
51
52
53
54
55
7
56
57
58
59
60
61
62
63
y
データ配列
#909090
#909090
#000000
#000000
img[22]
img[23]
img[24]
img[25]
・・・・・・・・・
x + y*img.width
#000000
#909090
img[31]
img[32]
x
Fly UP