PixelBenderでサーモグラフィ表現を作ってみよう
今回は「PixelBenderでサーモグラフィ表現を作ってみよう」ということで
PixelBenderフィルターを作っていく過程を合わせて書いてみます。
本来、サーモグラフィは見かけの温度を色として表示するため
赤外線強度を測定できるカメラを使用しなければ実現はできないのですが
画素のルミナンス(明るさ)を色に置き換えることで、
サーモグラフィっぽいビジュアルを表現してみます。
必要な処理について考える
まずは各ピクセルについてどのような処理が必要か考えます。
今回PixelBender内での処理の工程としては下記の図のようになります。
途中で入るレベル補正は、なくても構いませんが、
より細かい調整ができるように処理を入れています。
実際に作ってみる
1.Adobe Pixel Bender Toolkitを起動
2.まずはカーネルについて記述
< languageVersion : 1.0; > kernel Thermograph < namespace : ""; vendor : "Kousho Shimada"; version : 1; description : "Thermograph"; >
このあたりはコピペして必要な部分を編集してください。
3.次に入力される画像と、出力されるピクセルを宣言します
{ input image4 src; output pixel4 dst;
この部分も通常のPixelBenderであれば必ず記述する部分ですね。
src,dstの変数名部分は好きな名前を付けていただいて構いません。
4.次に可変にしたいパラメータを宣言します
parameter float min_level < minValue:float(0.0); maxValue:float(1.0); defaultValue:float(0.0); >; parameter float max_level < minValue:float(0.0); maxValue:float(1.0); defaultValue:float(1.0); >;
今回、パラメータとして変更したい部分はレベル補正時の最小輝度、最大輝度になります。
パラメータとして宣言したい場合は上記のように「parameter」を頭につけて宣言します。
また、minValue, maxValue, defaultValueで、
パラメータの最小値、最大値、デフォルト値を指定できます。
5.メインの処理を書いていきます
void evaluatePixel() {
evalutePixelという関数は、カーネル内で最低限1つは使用する必要のある関数で、
「ピクセルの値を求める」という名の通り、実際に(並行して)実行される
ピクセル処理を定義する関数となります。
6.出力ピクセルのデフォルト値を指定します
dst = pixel4(0.0, 0.0, 0.0, 1.0);
今回は最初に、出力ピクセルのデフォルト値を決めておきます。
pixel4(r,g,b,a)なので、上記は黒の不透明度1のピクセルです。
7.パラメータの設定が不正な場合はデフォルトのまま出力
if(max_level != min_level) {
パラメータとして設定されたmax_levelとmin_levelが同値の場合は
正しい出力が計算できないのでデフォルト値のまま出力します
8.ピクセルの色を取得
float2 pos = outCoord(); pixel4 col = sampleLinear(src, pos);
outCoord()で取得した座標を元に入力画像の該当ピクセルの色を
sampleLinearを使って取得します。
9.輝度の計算
float luminance = col.r * 0.29891 + col.g * 0.58661 + col.b * 0.11448;
10.輝度のレベル補正
luminance = max(0.0, min(1.0, (luminance - min_level) / (max_level - min_level)));
min_levelよりもmax_levelの値を小さくすると、明暗を反転させることができます。
11.輝度を元に色をつける
if(luminance < 1.0 / 6.0) { dst.b = luminance * 6.0; } else if(luminance < 2.0 / 6.0) { dst.b = 1.0; dst.g = luminance * 6.0 - 1.0; } else if(luminance < 3.0 / 6.0) { dst.g = 1.0; dst.b = 3.0 - luminance * 6.0; } else if(luminance < 4.0 / 6.0) { dst.g = 1.0; dst.r = luminance * 6.0 - 3.0; } else { dst.r = 1.0; dst.g = 3.0 - luminance * 3.0; }
以上で完成です。
PBJファイルは以下より
完成サンプルはこちら
ただの動画が急に実験動画的になりますね。
よかったら使ってみてください。