1. Qiita
  2. 投稿
  3. iOS

LUTで画像処理フィルターを効率的に量産する

  • 21
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ここでいうLUTはルックアップテーブルの略です。

まずはそのLUTで画像処理をするとはどういう事かというのを書こうかと思ったのですが、

UE4の説明が分かりやすいのでそれを見てみるのが早いでしょう。
https://docs.unrealengine.com/latest/JPN/Engine/Rendering/PostProcessEffects/ColorGrading/index.html

要するに、色をテーブルで変換するだけです。
テーブルというのは、以下のような画像です。

lut32.png

これを見るとそれぞれの四角で、
xがR成分
yがG成分
そして右のセルに行くほどB成分が0~1へとグラデーションされています。
これによってRGBそれぞれの成分がどう配置されるかが定義されています。
※もちろん、この画像は1:1のマッピングなので、フィルター的には何もしないものです。

しかし、ひとたびこの画像に対してグレースケールや、トーンカーブ調整をすると、
その調整がそのままフィルターになります。

例えばグレースケールをかけると以下のようなテーブルになります。
gray.png

これだけでグレースケールフィルターが出来てしまいました。

この方法の最大のメリットは、まさにこの部分で、
単一のアルゴリズムにも関わらず、非常に多種多様なフィルター表現が可能だということです。
さらに、もう一つ良いことがあります。
それはフィルターの作り方が非常に簡単だということです。

こちらは動画で見た方が分かりやすいかもしれません。
http://vimeo.com/38542834

どういう事かというと、
1、参考画像に、元となる何もしないテーブル画像(↓)を貼り付ける
lut32.png

2、画像処理をかける

3、画像処理がかかったグラデーションテーブル画像を書き出す

この3ステップでフィルターが作れます。
フィルター作成にわざわざプログラムを書く必要がないのです。

さて、このLUTのメリットを整理したところでiOSの実装の話に移ろうと思います。
1から実装を・・・とおもいきや、CoreImageのフィルターにすでにありました。

CIColorCube

です。なんともiOS SDKというのは痒いところに手が届くものですね。

軽く引数を見てみると、
inputCubeData => floatの3次元配列の生データのNSData。
inputCubeDimension => 配列の個数。例えば、16x16x16の3次元配列を用意したなら、ここには16を入れます。

これだけなのでとても簡単です。

リアルタイムグラフィックスでは、よく16x256のテーブルが使われるようですが、
画像処理、としてみたときには、少々このサイズは小さすぎると思います。
なので、32x1024がiOSではオススメなラインかと思います。

というわけで最後に以上のアプローチの実際に動作するサンプルを紹介して終わりにしようと思います。

https://github.com/Ushio/LUT_iOS

ss.png