Weitere ähnliche Inhalte Mehr von yuichi takeda (6) フーリエ変換と画像圧縮の仕組み2. 自己紹介
• Yuichi Takeda / @ginrou799
• 今
• ミクシィでiPhoneアプリの開発
• iOSの社内研修なども
• 本になりました http://goo.gl/OaLUDc
• オープンな勉強会として研修をやってます
(無料、Androidと隔週)
• 昔
• 大学、大学院の専攻は画像処理
今日は昔取った杵柄についてお話します
7. 目次
• 三角関数の復習
• フーリエ級数展開
• フーリエ変換
• 離散フーリエ変換
• 2次元離散フーリエ変換
• 画像のフーリエ変換
• 画像圧縮
• 分かりやすさを優先するために、
• 厳密性に欠ける箇所
• 代替表現を用いている箇所
•
があります
• 何か誤りがあったら指摘して
下さい
おことわり
8. 目次
• 三角関数の復習
• フーリエ級数展開
• フーリエ変換
• 離散フーリエ変換
• 2次元離散フーリエ変換
• 画像のフーリエ変換
• 画像圧縮
• 分かりやすさを優先するために、
• 厳密性に欠ける箇所
• 代替表現を用いている箇所
•
があります
• 何か誤りがあったら指摘して
下さい
おことわり
34. フーリエ級数展開の制約
先ほどの y = x も y = x もフーリエ級数展開の制約を満たさ
ない。そのような場合は、
1. 周期関数のみ(今回のケースだと周期は2π)
→ 周期関数としてみなして近似される
2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)
→ 滑らかでない点でギプスの現象が発生する
35. フーリエ級数展開の制約
先ほどの y = x も y = x もフーリエ級数展開の制約を満たさ
ない。そのような場合は、
1. 周期関数のみ(今回のケースだと周期は2π)
→ 周期関数としてみなして近似される
2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)
→ 滑らかでない点でギプスの現象が発生する
ギプスの現象
(ツノのように尖ってしまう)
周期関数のように近似されている
y = x のフーリエ級数展開の表示域をもっと広げると…
先ほどのグラフの範囲
36. フーリエ級数展開の制約
先ほどの y = x も y = x2 もフーリエ級数展開の制約を満たさ
ない。そのような場合は、
1. 周期関数のみ(今回のケースだと周期は2π)
→ 周期関数としてみなして近似される
2. 区分的に滑らか (有限個の点を除いて連続かつ微分可能)
→ 滑らかでない点でギプスの現象が発生する
フーリエ級数展開は近似を行うことができるが、
どんな関数も近似出来るわけではない
51. 離散フーリエ変換の例
例 ) 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, …]
出力 : 離散フーリエ変換の結果
元の関数のピーク付近の
周波数を含んでいる
関数の時と同じように、入力されるデータにどのような
周波数を含んでいるかを調べることができる
57. 二次元の周波数の三角関数
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
83. 画像のフーリエ変換と再構成
やり方
フーリエ変換の値 を 対応する波形 に掛けてを足しあわせていく
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 =
…
再構成結果
… …
再構成できた!
91. 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 126 197
90 80 76 55 65 113 173 207
60 57 64 77 107 160 198 208
65 75 88 127 158 188 202 203
102 116 137 163 186 197 198 202
• 画像全体を 8 8 の
ブロックに分割する
• 例えば320 320の画像の
場合は40 40 = 1600 個の
ブロックができる
• 以降の処理は各ブロック
ごとに行う
92. 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 126 197
90 80 76 55 65 113 173 207
60 57 64 77 107 160 198 208
65 75 88 127 158 188 202 203
102 116 137 163 186 197 198 202
• 各ブロックを離散コサイ
ン変換を行う
• 離散コサイン変換は離散
フーリエ変換の基底関数
を変えたもの(離散フーリ
エ変換の親戚のようなも
の)
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
低周波数
高周波数画像 離散コサイン変換
93. 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 : 量子化幅
95. 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) の位置
96. 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になった
97. 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 <終端>
98. 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 126 197
90 80 76 55 65 113 173 207
60 57 64 77 107 160 198 208
65 75 88 127 158 188 202 203
102 116 137 163 186 197 198 202
8x8=64byte
圧縮
• この例では75%ほどの圧縮率だが、ブロック内で明るさ
に変化が少ないとより圧縮率は向上する
• さらにランレングス符号化やハフマン符号化も行う