Slide 1

Slide 1 text

画像リサイズの重箱の 隅を突く話 (前半) 2019/11/15(⾦) “よや”

Slide 2

Slide 2 text

⾃⼰紹介 • twitter.com/yoya • github.com/yoya • ImageMagick ウォッチャー(⾃称) • 画像リサイズのうんちく (今回のネタ下) • https://qiita.com/yoya/items/95c37e02762431b1abf0

Slide 3

Slide 3 text

発表のきっかけ https://twitter.com/yoya/status/1192667961934278656

Slide 4

Slide 4 text

サムネール⽣成のうんちく(仮)から抜粋 • 画像リサイズ処理 • ⾊々 • アスペクト⽐ • メタデータ • 画像の回転 (orientation) • サムネール 画像 • GPS位置情報 • 撮影情報(カメラ型番や設定など • ⾊空間 ࠓ೔͸ίϨ

Slide 5

Slide 5 text

画像リサイズの処理⽅式 • 補間フィルタ • フィルタの種類 • セパラブルの順序 • フィルタのカーネル粒度 • オフセット (コーナー合わせ) • エッジ処理 • 次回予定 • ビット深度 • ガンマ補正 • USM (unsharp mask) • パレット⾊保持 ࠓ೔͸͜͜·Ͱ

Slide 6

Slide 6 text

知る事のメリット • 任意の画像処理エンジンと厳密に⼀致させる処理が⾃作できる (かもしれない) • ⾃分の⽤途にあった改造ができる • 画像サービスの使ってる画像エンジンを推測できる • バージョンまである程度絞れる(かもしれない)

Slide 7

Slide 7 text

補間フィルタ • リサイズ結果が違う場合、⼤抵これが原因 • 拡⼤してできる隙間をどう埋めるか => 補間フィルタ ϐΫηϧΛ޿͛Δ 伱ؒΛຒΊΔ

Slide 8

Slide 8 text

補間フィルタ • 縮⼩の場合、どのように混ぜるか ϐΫηϧΛߥ͘͢Δ ࠞͥΔ

Slide 9

Slide 9 text

補間フィルタの種類 • よく使われるのは以下の4つ • NearestNeighbor • Bi-Linear • Bi-Cubic • Catmul-Rom (B:0, C:1/2) • Mitchell (B:1/3, C:1/3) • Lanczos (Lobe:3,4) この辺は常識なので説明省略! https://en.wikipedia.org/wiki/Bicubic_interpolation

Slide 10

Slide 10 text

補間フィルタ (セパラブル) • 2次元のフィルタを縦と横で分けて処理できる

Slide 11

Slide 11 text

補間フィルタ (セパラブル) • 良いといっても、計算機誤差からの差異は⽣じる • 左が実験画像、真ん中は横=>縦の順。右は縦=>横の順、差分強調

Slide 12

Slide 12 text

補間フィルタ (セパラブル) • 横を先に処理して、次に縦 (Python-Pillow) • メモリは横の⽅が局所的アクセスできる • より縮⼩率の⾼い⽅を先に処理する (ImageMagick 5以降) • なるべく途中の画像が⼩さくなるように • 縦が広がる場合は横を先に処理する (ImageMagick 4以前) • アスペクト⽐で判断

Slide 13

Slide 13 text

補間フィルタ (カーネル粒度) • 補間フィルタのカーネル計算が重たいケースがある -BODPT ͳΜͯ ΊͬͪΌॏ͍ͨ ⼀度、計算した結果を LUT(lookup table) に保存して、 これを元に畳み込み計算する

Slide 14

Slide 14 text

補間フィルタ (カーネル粒度) • ImageMagick では 0.01 刻みの LUT を持つ • OpenCV はリサイズ後の画像サイズの LUT • FFmpeg swscale は dstW/srcW (+α) の LUT

Slide 15

Slide 15 text

補間フィルタ (オフセット) • ピクセルの広げ⽅にも種類がある ࠨ্߹Θͤ ਅΜத߹Θͤ ࢛۱߹Θͤ DPSOFS@BMJHOFE PGGTFU OBJWF ͍͍ͩͨίϨ

Slide 16

Slide 16 text

補間フィルタ (オフセット) • Pillow(PIL) の動きがバージョンで異なる • https://qiita.com/yoya/items/3b4a8080516259ece684 1JMMPXҎલ ೥݄೔ 1JMMPXҎ߱ ೥݄೔

Slide 17

Slide 17 text

補間フィルタ (オフセット) • Pillow-3.3.3以前 Pillow-3.4.0以降

Slide 18

Slide 18 text

補間フィルタ (エッジの畳み込み) • Bi-Linearを含む⼤抵のフィルタは混ぜる範囲が画像の外を巻き 込む ࠞͥΔ

Slide 19

Slide 19 text

補間フィルタ (エッジの畳み込み) • ImageMagick, PIL(Pillow) • 画像の外を無視する • 画像の中だけで畳み込む • 畳み込みが中途半端 ը૾ ͷ֎ 255 0 0 x0.75 x0.75 *0.25 191/(0.75+0.75+0.25) =191 =0 =0 = 109 *0.25

Slide 20

Slide 20 text

補間フィルタ (エッジの畳み込み) • OpenCV • エッジの⾊が外に続く仮定 255 0 0 x0.75 x0.75 *0.25 =191 =0 =0 = 127 255 *0.25 =63 ը૾ ͷ֎ ͖ͬ͞ͷ ΑΓ ໌Δ͍ (63+191)/(0.25+0.75+0.75+0.25)

Slide 21

Slide 21 text

補間フィルタ (エッジの畳み込み) • 本来、画像の外側の仮定によってリサイズ結果を変えるべき &EHF3FQFBUFE 3FGMFDU NJSSPS 5JMJOH

Slide 22

Slide 22 text

まとめ • リサイズの実装アルゴリズムは選択肢が多くある • これらの組み合わせから、サムネール画像を⾒て処理に使った 画像エンジンを推測する事ができる。(かもしれない)

Slide 23

Slide 23 text

次回予告 • 次回予定 • ビット深度 • ガンマ補正 • USM (unsharp mask) • パレット⾊保持