Upload
yuichi-takeda
View
85.772
Download
12
Embed Size (px)
Citation preview
自己紹介• Yuichi Takeda / @ginrou799
• 今
• ミクシィでiPhoneアプリの開発
• iOSの社内研修なども
• 本になりました http://goo.gl/OaLUDc
• オープンな勉強会として研修をやってます(無料、Androidと隔週)
• 昔
• 大学、大学院の専攻は画像処理
今日は昔取った杵柄についてお話します
画像のファイルフォーマットとファイルサイズ
lenna.bmp 236 KB
lenna.png 158 KB
なぜ、見た目はほぼ変わらないのにjpegの画像は ここまでファイルサイズが小さいのか?
なぜJPEGがこんなに高圧縮率を実現しているかを解説
lenna.jpg 36 KB
目次
• 三角関数の復習
• フーリエ級数展開
• フーリエ変換
• 離散フーリエ変換
• 2次元離散フーリエ変換
• 画像のフーリエ変換
• 画像圧縮
• 分かりやすさを優先するために、 • 厳密性に欠ける箇所 • 代替表現を用いている箇所
• があります
• 何か誤りがあったら指摘して下さい
おことわり
目次
• 三角関数の復習
• フーリエ級数展開
• フーリエ変換
• 離散フーリエ変換
• 2次元離散フーリエ変換
• 画像のフーリエ変換
• 画像圧縮
• 分かりやすさを優先するために、 • 厳密性に欠ける箇所 • 代替表現を用いている箇所
• があります
• 何か誤りがあったら指摘して下さい
おことわり
フーリエ級数展開
をフーリエ係数と呼ぶ
周期2πの周期関数について、以下のように近似できる様々な周波数のsin, cosの
重ねあわせ
※先ほどの例も y = x をフーリエ級数展開したもの
定数項もある
フーリエ級数展開の制約確かに三角関数で近似できそうだ。
ところでフーリエ変換は任意の関数について成立するの?
実は、以下の制約を満たす関数のみに限定される
1. 周期関数のみ(今回のケースだと周期は2π) 2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)
フーリエ級数展開の制約先ほどの y = x も y = x もフーリエ級数展開の制約を満たさない。そのような場合は、
1. 周期関数のみ(今回のケースだと周期は2π)→ 周期関数としてみなして近似される
2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)→ 滑らかでない点でギプスの現象が発生する
フーリエ級数展開の制約先ほどの y = x も y = x もフーリエ級数展開の制約を満たさない。そのような場合は、
1. 周期関数のみ(今回のケースだと周期は2π)→ 周期関数としてみなして近似される
2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)→ 滑らかでない点でギプスの現象が発生する
ギプスの現象 (ツノのように尖ってしまう)
周期関数のように近似されている
y = x のフーリエ級数展開の表示域をもっと広げると…
先ほどのグラフの範囲
フーリエ級数展開の制約先ほどの y = x も y = x2 もフーリエ級数展開の制約を満たさない。そのような場合は、
1. 周期関数のみ(今回のケースだと周期は2π)→ 周期関数としてみなして近似される
2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)→ 滑らかでない点でギプスの現象が発生する
フーリエ級数展開は近似を行うことができるが、 どんな関数も近似出来るわけではない
フーリエ係数と周波数フーリエ係数は、様々な周波数の三角関数の級数で表した時に各周波数がどれだけ含まれているかを表す
先ほどの y = x2 の場合
周波数 係数
定数項 π2/3
cos(x) -4
cos(2x) 1
cos(3x) -4/9
… …
フーリエ係数と周波数
このようにフーリエ係数を求めることで、関数がどのような周波数で構成されているかを調べることができる
周波数 係数
定数項 π2/3
cos(x) -4
cos(2x) 1
cos(3x) -4/9
… …
定数項や, cos(x), cos(2x)などの低い周波数の影響(振幅)が大きく、高い周波数ほどその影響(振幅)が小さくなっている
フーリエ変換このフーリエ係数を求める過程を拡張し、ある関数の周波数ごとの特性を表す関数に変換する変換をフーリエ変換という
フーリエ変換
数直線上のある点xにおいてどのような値を取るか
を返す関数
ある周波数ωに対してどのような値(特性)を取るか
を返す関数
係数みたいな数値じゃなくて関数として扱えるようにしようぜ!!
フーリエ変換の導出フーリエ級数展開を用いてフーリエ変換を導出します。
• フーリエ級数展開の複素数表現 • 任意の周期への拡張 • 無限周期への拡張 • フーリエ変換と逆フーリエ変換
時間がないので少し巻き気味に進めます。
フーリエ変換の導出• フーリエ級数展開の複素数表現フーリエ級数展開にはsinとcosの両方が入っていて 式が煩雑なので複素数を使って一つにまとめます
オイラーの公式( )を使うと, sin, cosを 以下のように置き換えることが出来ます
式が少しスッキリした!
フーリエ変換の導出• 無限周期への拡張 フーリエ級数展開の式の中にフーリエ係数の式をねじ込みます
T → ∞ とすることで無限周期へと拡張します。この時、総和(Σ)は2π/T → ω を積分変数とする積分になります
ck
フーリエ変換の導出• フーリエ変換と逆フーリエ変換
この部分がフーリエ係数の式にあたる この部分だけ取り出したのがフーリエ変換
フーリエ変換 :
数直線上の表現(空間領域)から周波数による表現(周波数領域)への変換
逆フーリエ変換 :
周波数領域にある関数を元の空間領域に戻す変換
フーリエ変換の導出• フーリエ変換と逆フーリエ変換
この部分がフーリエ係数の式にあたる この部分だけ取り出したのがフーリエ変換
フーリエ変換 :
数直線上の表現(空間領域)から周波数による表現(周波数領域)への変換
逆フーリエ変換 :
周波数領域にある関数を元の空間領域に戻す変換
フーリエ変換、逆フーリエ変換を使うことである関数について周波数で表現したり、元の表現に戻したりすることができる
フーリエ変換の例• 例 )
いきなりフーリエ変換や周波数領域と言われてもなんのこっちゃっていう感じだと思うので
サンプルを紹介します
フーリエ変換すると
どんな周波数が含まれて いるかが分かりづらい
どんな周波数が含まれて いるかがひと目で分かる
空間領域 周波数領域
フーリエ係数展開とフーリエ変換
A :
• フーリエ変換はフーリエ係数をベースに広げたものなので、初見ではあまり違いはないように見えるかも
• 周期関数を仮定しなくても使えるようになった
• 関数を周波数による表現(特徴づけ)を行えるようになった
Q : フーリエ変換は、まぁ分かりました。 ただ、フーリエ級数展開とフーリエ変換は何が違うの?
離散データの取り扱い今までのフーリエ変換は連続値の関数を取り扱ってきたが、コンピュータで処理を行うためには離散的なデータ点で処理を行わなければならない
今まで取り扱ってきた”関数” 任意の値xを入力すると一意の出力が得られる
f(x) = sin(x)
コンピュータで取り扱うことのできる有限個のデータ点。既に出力結果は与えられており、”n番目の値”のような形でアクセス(いわゆる配列)
xn = [0.308, 0.586, 0.807…]
離散フーリエ変換N点からなる離散的なデータ点xn(n=0,1,...N-1)に対する離散フーリエ変換は以下のように定義される
• 離散データでは微分/積分 が厳密に計算できないので総和を用いる
• 有限個のデータ点なので、無限の総和を計算出来ない→ 周期Nの周期性を仮定
• xnに含まれる周波数は0~N-1 までを仮定する
jは虚数成分
ポイント
離散フーリエ変換の例
例 ) y = 3sin(x) + sin(7x) (0 ~ 2πの範囲で60点サンプリング)
xn = [0, 0.982, 1.618, 1.736, …]入力 : データ点
Xn = [0, 9, 0, 0, 0, 0, 0, 3, …]出力 : 離散フーリエ変換の結果
元の関数のピーク付近の周波数を含んでいる
関数の時と同じように、入力されるデータにどのような 周波数を含んでいるかを調べることができる
ここまでのまとめ
• 関数は三角関数の級数で表現できる(フーリエ級数展開)
• フーリエ変換を用いると、ある関数に含まれている周波数の分布を求めることができる
• 離散フーリエ変換を用いると、関数だけでなく任意のデータの周波数の分布を求めることができる
ここからは、これを2次元に拡張し、画像へと応用する
二次元離散フーリエ変換二次元離散フーリエ変換は以下のように定義される
• 入力は2次元のデータ点(2次元配列のようなもの)
• 2次元の様々な周波数の三角関数が入力にどれくらい含まれているを表す
2次元の周波数の 三角関数??
二次元の周波数の三角関数
Xu,v は 縦方向にu/2本のピークがあり、横方向にv/2本のピークのある 三角関数がどれくらい元のデータに含まれているか表してる
X0,1 X0,8 X0,16X0,0
X8,0 X8,1 X8,8 X8,16
X16,0 X16,1 X16,8 X16,16
画像のフーリエ変換
二次元のデータ点である画像をフーリエ変換すると
128
128
このような波形がどのような割合で含まれているかを表す
画像がどのような周波数からできているかを知ることが出来る! → この性質を利用すれば画像を再構成できる
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =
再構成結果
…
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
画像のフーリエ変換と再構成やり方 フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
7.49×106 -5.53×105 … 8.98×103
3.81×105 2.84×105 … -4.95×103
… … … …
1.00×103 -1.69×103 … 3.29×103
Xu,v =…
再構成結果
… …
再構成できた!
画像圧縮画像圧縮には、フーリエ変換をすることで分かる、周波数の偏りを利用して行う
画像における周波数の偏り私達がよく目にする画像は、周波数の低い成分が多く、高い成分が少ないという傾向がある
多い
少ない画像 フーリエ変換
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
35 38 55 90 65 50 72 163
40 42 68 112 77 56 66 157
66 66 90 108 74 53 87 177
84 91 83 72 57 66 126197
90 80 76 55 65 113173207
60 57 64 77 107160198208
65 75 88 127158188202203
102116137163186197198202
• 画像全体を 8×8 のブロックに分割する
• 例えば320×320の画像の場合は40×40 = 1600 個のブロックができる
• 以降の処理は各ブロックごとに行う
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
35 38 55 90 65 50 72 163
40 42 68 112 77 56 66 157
66 66 90 108 74 53 87 177
84 91 83 72 57 66 126197
90 80 76 55 65 113173207
60 57 64 77 107160198208
65 75 88 127158188202203
102116137163186197198202
• 各ブロックを離散コサイン変換を行う
• 離散コサイン変換は離散フーリエ変換の基底関数を変えたもの(離散フーリエ変換の親戚のようなもの)
1136.0 -292.3 83.3 -237.2 195.2 -32.0 23.7 -52.9
1236.0 -242.4 2.5 -247.6 217.8 -20.0 35.7 -67.7
1442.0 -198.3 120.4 -286.7 182.4 -11.2 28.2 -25.1
1552.0 -255.1 332.9 -224.3 62.2 -25.3 -9.3 -6.4
1718.0 -429.2 376.0 -74.6 -35.4 21.4 17.2 15.8
1862.0 -643.2 178.9 30.5 -38.2 24.8 7.0 -1.9
2212.0 -605.1 -30.6 50.7 0.0 5.2 -14.9 -18.2
2602.0 -408.2 -98.5 9.0 7.1 -11.9 2.5 -2.6
低周波数
高周波数画像 離散コサイン変換
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
• 離散コサイン変換の結果の浮動小数点を量子化して整数にする
1136.0 -292.3 83.3 -237.2 195.2 -32.0 23.7 -52.9
1236.0 -242.4 2.5 -247.6 217.8 -20.0 35.7 -67.7
1442.0 -198.3 120.4 -286.7 182.4 -11.2 28.2 -25.1
1552.0 -255.1 332.9 -224.3 62.2 -25.3 -9.3 -6.4
1718.0 -429.2 376.0 -74.6 -35.4 21.4 17.2 15.8
1862.0 -643.2 178.9 30.5 -38.2 24.8 7.0 -1.9
2212.0 -605.1 -30.6 50.7 0.0 5.2 -14.9 -18.2
2602.0 -408.2 -98.5 9.0 7.1 -11.9 2.5 -2.6
(量子化の結果) = [Xu,v / (pu,v / 2)]
Xu,v : 離散コサイン変換の値 pu,v : 量子化幅
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
• 周波数ごとに量子化幅が違う
• 左上(低周波数)の方が量子化幅が小さい= より密に情報を残す
• 右下(高周波数)に行くに連れて量子化幅が大きくなる = 情報をあまり残さない
量子化幅16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 68 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109113 92
24 35 55 64 81 104113 92
49 64 78 87 103121130101
72 92 95 98 112100103 99
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
量子化幅16 11 10 16 24 40 51 61
12 12 14 19 26 58 60 55
14 13 16 24 40 57 68 56
14 17 22 29 51 87 80 62
18 22 37 56 68 109 113 92
24 35 55 64 81 104 113 92
49 64 78 87 103 121 130 101
72 92 95 98 112 100 103 99
1136.0-292.383.3-237.2195.2-32.023.7-52.9
1236.0-242.42.5-247.6217.8-20.035.7-67.7
1442.0-198.3120.4-286.7182.4-11.228.2-25.1
1552.0-255.1332.9-224.362.2-25.3-9.3 -6.4
1718.0-429.2376.0-74.6-35.421.417.215.8
1862.0-643.2178.930.5-38.224.8 7.0 -1.9
2212.0-605.1-30.650.7 0.0 5.2 -14.9-18.2
2602.0-408.2-98.5 9.0 7.1 -11.9 2.5 -2.6
離散コサイン変換
1136.0 16量子化後の値 = [Xu,v / (pu,v / 2)]
= [1136.0/(16/2)] = [142.0] = 142
例(0,0) の位置
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割1136.0-292.3 83.3 -237.2 195.2 -32.0 23.7 -52.9
1236.0-242.4 2.5 -247.6 217.8 -20.0 35.7 -67.7
1442.0-198.3 120.4 -286.7 182.4 -11.2 28.2 -25.1
1552.0-255.1 332.9 -224.3 62.2 -25.3 -9.3 -6.4
1718.0-429.2 376.0 -74.6 -35.4 21.4 17.2 15.8
1862.0-643.2 178.9 30.5 -38.2 24.8 7.0 -1.9
2212.0-605.1 -30.6 50.7 0.0 5.2 -14.9 -18.2
2602.0-408.2 -98.5 9.0 7.1 -11.9 2.5 -2.6
142 -53 16 -29 16 -1 0 -1
206 -40 0 -26 16 0 1 -2
206 -30 15 -23 9 0 0 0
221 -30 30 -15 2 0 0 0
190 -39 20 -2 -1 0 0 0
155 -36 6 0 0 0 0 0
90 -18 0 1 0 0 0 0
72 -8 -2 0 0 0 0 0
離散コサイン変換の結果 量子化の結果 → 多くの要素が0になった
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
142 -53 16 -29 16 -1 0 -1
206 -40 0 -26 16 0 1 -2
206 -30 15 -23 9 0 0 0
221 -30 30 -15 2 0 0 0
190 -39 20 -2 -1 0 0 0
155 -36 6 0 0 0 0 0
90 -18 0 1 0 0 0 0
72 -8 -2 0 0 0 0 0
量子化の結果
• (0,0)の要素からジグザグに平坦化する
• この時、残りの要素が全てゼロとなる点までで打ち切る
142,-53,206,206,-40,16,-29,0,-30,221,190,-30-15,-2616,-1,0,0,9,-15,20,-36,90,72,-18,6,-2,2,0,1,-2,0,0,-1,0,0,-8,-2,1 <終端>
JPEG圧縮
ジグザグスキャン量子化離散コサイン
変換8x8に分割
142,-53,206,206,-40,16,-29,0,-30,221,190,-30-15,-2616,-1,0,0,9,-15,20,-36,90,72,-18,6,-2,2,0,1,-2,0,0,-1,0,0,-8,-2,1 <終端>
49byte
35 38 55 90 65 50 72 163
40 42 68 112 77 56 66 157
66 66 90 108 74 53 87 177
84 91 83 72 57 66 126197
90 80 76 55 65 113173207
60 57 64 77 107160198208
65 75 88 127158188202203
102116137163186197198202
8x8=64byte
圧縮
• この例では75%ほどの圧縮率だが、ブロック内で明るさに変化が少ないとより圧縮率は向上する
• さらにランレングス符号化やハフマン符号化も行う
まとめ
• フーリエ級数展開を用いると様々な関数を三角関数の級数で表現できる
• フーリエ変換、離散フーリエ変換を用いることで様々な関数やデータがどのような周波数を含んでいるかを調べることができる
• 画像は様々な周期の縞模様から再構成できる
• JPEGは画像に含まれる周波数の偏りを利用して圧縮を行っている