JPEGのDCTブロックで コンテンツ指向のトリミング

15
JPEGのDCTブロックで コンテンツ指向のトリミング 古田陽介(@4_suke)

Transcript of JPEGのDCTブロックで コンテンツ指向のトリミング

JPEGのDCTブロックで コンテンツ指向のトリミング

古田陽介(@4_suke)

こんなことない?

• 構図を工夫して撮影した写真

• Webサイトにアップロードしたら真ん中でトリミングされたサムネイル作られる

• 切ない

• コンテンツの場所を考慮して切り取ってくれればいいのに!

コンテンツ指向のトリミング?

• トリミングする場所やサイズを画像内容によって変化させることをここではそう呼ぶことにします

http://www.imagemagick.org/discourse-server/viewtopic.php?t=18065

× 顔認識は計算リソースがかなり必要

× 事前計算する場合、それを記録するストレージが必要

× 顔以外は考慮してくれない

× 画像変換サービスにはかなり重い

FacebookのOGP画像に顔が入っている場合のトリミング位置 | Sunday In The Park http://snowadays.jp/2014/03/2629

• 実例:Facebook

• 顔認識の結果をベースとしている(らしい)

• なんかもっと

• ライトな方法ってないだろうか

• そうだ!

• JPEGエンコーダーの

• DCTブロックを直接参照すればいいじゃないか

話すこと

• JPEGデコーダに処理を追加して高周波成分の中心位置を求め、

• その情報を使ってトリミングをしたら、

• 構図を工夫した画像でも良い感じに切り抜きできた

↑ 元画像

←真ん中で切り取り

今回話す方法→

原理1. JPEGのデコードの過程で、元画像を8x8pixelごとに離散

コサイン変換(DCT)したデータを得られる

2. 画像をDCT変換すると高周波と低周波に分離できる

3. 経験則:コンテンツのある場所は周波数が高い

• 写真:ピントが合ってエッジが立ってる

• イラスト:書き込みが多く、輪郭線が多い

• 顔:目や口、髪の毛の陰影

アプローチ• ハフマン展開+逆量子化とDCT-I の間に処理を追加

• 各ブロック内の高周波成分を積分してブロックの特徴量を算出

• 全ブロックの特徴量の重心を計算

• 重心が枠に入るように適当なサイズでcrop

• ハフマン展開+逆量子化

• 高周波成分の算出

DEMO

✓JPEGの圧縮・展開工程内のDCTをそのまま使うので追加計算が少ない

✓追加実装も少ない!

✓パターンマッチングではないのでコンテンツの種類を問わない

× JPEGにしか適用できない

× 緻密なコンテンツ、複数の物体が同居しているコンテンツにはメリット小さい

× 文字が入っているコンテンツは苦手

• そのうちやりたいこと

• libjpegに組み込む

• 定量的評価

• jpgjs のバグ直す

https://github.com/yohsuke/jpgjs/tree/content-detected-crop