見出し画像

SubstanceDesigner Quantize 量子化と減色

SbstanceDesigner の関数を書きたい人向け


先ず結論

お勧め! PixProcessreで 自然な減色とMinMaxのマッピングの式

PixProcessreで書く場合・・・MinMaxは事前に取得する。Step数を外のパラメータに出しておく。
この例ではInputValueを使っているが、ExposeParameterでもよい。

inside PixelProcessor

AutoLevelの後にQuantiz (Step=4,Offset=0.5)と同じ結果になるので
その後に、グレースケールをマッピングする。
すると、上と同じ結果になる。どちらかお好きな方で!


おおまかな雰囲気が合っていれば良いのなら、あまり気にする必要はない。しかし、正確な値を必要とするなら癖を知っておこう。
まずQuantizeColorQuantizeGrayscaleでは計算が異なっている。
そのうえでQuantizeGrayscaleを減色に使う場合に若干注意がいる。

減色用に使うなら自分でカスタムしたほうが安心!


カラーとグレースケールの違い

QuantizeColorと右QuantizeGrayscaleでColorの方は明らかに中心がズレる
QuantizeColorと右QuantizeGrayscaleでColorの方は明らかに中心がズレる

正確な値のコントロールを必要とする場合

  • グレースケールが0~1までのフルレンジ画像の場合
    > Step数必要な数-1を入力して、Offset0.5を入れた方が良い。
    Step数を入れるだけでは内部的にCeil処理があり最小値が使われない。 > QuantizeColorをグレースケール変換をしてこちらを使っても良いがこちらは別途癖がある。上の画像、真ん中がずれていることに注意!

  • 階調の浅いグレースケール入力の場合、色パレットは0~1までののレンジで量子化されるため、狙った色数を指定するのが困難。
    > 階調のレンジを広げてから量子化し、後から欲しい階調をリマップする
    その際MinMaxノードが役立つ。
    この発想は、 ColorをQuantizeする場合でも役立つ。


以下、検証メモ

既存のQuantize

ネットワーク図
クレースケールのグラデーション
既存のQuantize処理、Step=4

少しだけ加工を施す

AutoLevel処理後
既存のQuantize処理、Step=4 Offset=0.5

ここまでの素材を比較用に合成してみた

比較画像

左から

  1. Linear

  2. Quantize (Step=4)

  3. Quantiz (Step=4) and AutoLevel 

  4. Quantiz (Step=4 ,Offset=0.5)

最小値0.5の場合

レベル補正されたグラデーション 1~0.5
Quantiz (Step=4)

ステップは4のはずなのに、パレットが 1__0.75__0.5__0.25 の4快調しかないので結果の出力は2段階になってしまった。


最大値と最小値を含めた最適な範囲の色数にしたい

▲▲▲ MinMaxノードを挟んで、画像の明るさの最小値と最大値を取得し、PixelProcessor にて処理する
▲▲▲ …となかなか良い感じになった。
▲▲▲ 一見良い感じになったように見えるが・・・・個のグラデーションは左端で、中央にある元のグラデーションと綺麗に対応していない。

これを解決するには、左端のパレットとなる4色とインプットのグレースケール値の近さによってグラデーションの分布を分ける必要がありそうだ。

より好ましいQuantizeを利用した減色

▲▲▲ Min=0.2 Max=0.7 のグラデーションを作ってみる。
▲▲▲ お勧めと同じ結果になるが、ここでは違うノード構成で同じことをやっておく。
▲▲▲ AutoLevel の後に Quantiz (Step=4,Offset=0.5)
▲▲▲ 左の均等割りよりも、右の方が減色前と比較して自然なグラデーションに見える。そして、実際のグラデーションの範囲内でStep数分の色数になった。

歪んだ画像でテスト

▲▲▲ Base Input
基本の入力
▲▲▲ Considering the approximation and MinMaxMaqpping
お勧めの方法
▲▲▲ equal division MinMaxMapping
均等割りで境界線がずれているままのもの
▲▲▲ QuantizeGrayscale
基本の量子化ノード
▲▲▲ AutoLevel → Quantize → MinMaxMapping
値は正確ではないが、見た目の印象はそここそ合っている。

Thanks for reading!

この記事が気に入ったらサポートをしてみませんか?