省型旧形国電の残影を求めて

戦前型旧形国電および鉄道と変褪色フィルム写真を中心とした写真補正編集の話題を扱います。他のサイトでは得られない、筆者独自開発の写真補正ツールや補正技法についても情報提供しています。写真補正技法への質問はコメント欄へどうぞ

ART 機能紹介: Tetrahedral Color Warping (RGB) - 変褪色したフィルムスキャン画像補正に使えるか

f:id:yasuo_ssi:20210904211415j:plain

 今回 ART のバージョンアップと前後して、作者の A. Griggio 氏が ART で使えるようアレンジした CTL (カラー変換言語) スクリプトを何点か公開しました。ダウンロード先はこちらです。

 

 この中に、Tetrahedral Color Warping (RGB) (三角錐 (四面体) 色変換) というスクリプトがあります。このスクリプトは、変褪色したフィルムスキャン画像の補正になかなか使えそうなので、本日はこのスクリプトを紹介してみたいと思います。このスクリプトを ART で使えるようにするための方法は、下記記事をご参照ください。

yasuo-ssi.hatenablog.com

■ユーザインターフェースの解説

 このスクリプトを ART 上で有効化すると、カラー/トーン補正モジュールのモードから選択できるようになります。

CTL を有効化した カラー/トーン補正 モードの選択肢

 そして、この CTL の ART 上でのユーザインターフェースは下記のようになります。

四面体色変換 (RGB) のダイアログ

 このダイアログの説明ですが、まず、Red, Green, Blue, Cyan, Magenta, Yellow, Black, White の項目があり、その下に、R, G, B の調整スライダーがあります。この色項目は画像中の調整したい色部分です。その下のR, G, B 調整スライダーはその色部分をどのように調整したいかを指定します。

 例えば画像中の青い部分の色を調整したい場合は、Blue の下の R, G, B 値のスライダーを動かして青の色味を調整します。

 例えば、下記の写真ですが...

調整前オリジナル

 空などの青い部分を赤くしたい場合は、Blue 項目の下の RGBスライダーの R を + の方向に大きく動かすと...

Blue 項目の R 値を最大限まで引き上げる

 空が赤くなりました。

 また青の領域の青みをさらに増したいときは Blue 項目の下の Blue 値を増やし、逆に、黄色くしたい場合は、Blue 値を減らします。

 なおこの調整を行うためには色の原色ー補色関係を理解している必要があります。

----

■本 CTL スクリプトによる色変換操作解説

 この CTL スクリプトは何をやっているのかというと、画像の各ピクセル中、相対的にその原色 or 補色の領域に入るピクセルに対し、大雑把に言えば原色、および補色の色を調整して適用することで、その部分の色の色調を変化させる、ということのようです。

 原色の色を調整するという点では、ARTのチャンネルミキサーの原色補正モジュールに近いことをやっているようです。

 以下、プログラムコードに沿って、具体的に何をやっているのか説明していきます。

 まず、相対的に Red, Green, Blue, Cyan, Magenta, Yellow である領域を区分しますが、この区分は各ピクセルの R, G, B 値を基に次のようにして分類しています。

R > G > B: 相対的に 黄~オレンジ~赤 であるピクセル

R > B > G: 相対的に マゼンタ~赤 であるピクセル

B> R > G: 相対的に マゼンタ~紫~青 であるピクセル

B > G > R: 相対的に シアン~水色~青 であるピクセル

G > B > R: 相対的に シアン~青緑~緑 であるピクセル

G > R > B: 相対的に 黄~黄緑~緑 であるピクセル

 ところで、このツールの名称がなぜ Tetrahedral Color Warping (三角錐色変換) なのかと思われるでしょうが、これについては、以下の記事をご参照ください。要は分類された各色領域が色空間上三角錐 (四面体) になるということです。「三角錐色領域色変換」ぐらいの訳が日本語として適当かもしれません。

blogs.mathworks.com 

 このように画像中のピクセルを6種類に分類したうえで、それぞれのピクセルに対して、以下のような補正式を適用しています。

 まず、あるピクセルの中で最も値の高い原色を第1原色、2番目に高い原色を第2原色、最も価の低い原色を第3原色とします。そして第1~3原色の補色を第1~3 補色とします。そして、スライダーで指定した各補正値を xx補正値とします。この時、以下の式で補正をかけます。

  rgb[i] = 第1原色 * (第1原色の補正値[i] - 黒の補正値[i]) + 黒の補正値[i] + 第2原色 * (第3補色補正値[i] - 第1原色補正値[i]) + 第3原色 * (白補正値[i] - 第3補色補正値[i]);
         

 これだと抽象的過ぎて何を言っているのか分かりませんので、具体例で考えます。

 例えば、相対的にマゼンタである部分のマゼンタを弱めたい (マゼンタ被りを消したい) 場合は、Magenta 項目 の下の、Magenta とは補色関係にある Green の値をスライダーで上昇させます。

 因みにデフォルト値は、各原色及び補色が純色になるように設定されています。例えば Red であれば、 R=1.0, G=0.0, B=0.0, Yellow であれば R=1.0, G=1.0, B=0.0 という具合ですがこれを各原色 or 補色ごとに R, G, Bのスライダーをいじって原色及び補色を純色からずらして調整する訳です。

 以下が具体的なマゼンタ被りを消したいときのスライダー値です。

マゼンタの補正

 Megentaの下の、0 だったGreenの値を 0.728 に上げてみました。

 そして、ピクセルの値が相対的にマゼンタであるのは、R > B > G のケースですので、この場合は、この条件に当てはまるピクセルに対し、以下の式で該当ピクセルのrgb値を補正します。

rgb[i] = R元値 * (red補正値[i] - blk補正値[i]) + blk補正値[i] + G元値 * (wht補正値[i] - mag補正値[i]) + B元値 * (mag補正値[i] - red補正値[i])

※ i には、r, g, b のいずれかが該当

 この領域は相対的に赤~マゼンタである領域ですが、上の式を見ると、White, Black および Red と Magenta に対して指定した値が反映するようになっていることが分かります。つまり相対的にその色に該当する領域 (ピクセル)に対して、その領域 (ピクセル)に関連する色に対するパラメータのみ反映するになっています (但し、Black, White 項目で指定した値は全領域に対し影響を与えます)。また、当該ピクセルの r, g, b のそれぞれの値は、自チャンネルの元の値のみならず、設定によっては、他チャンネルの元の値にも影響を与える可能性があります(例えば、r の値を変化させるときに、元の g, b 値も影響を与える可能性がある)。一方、この相対的に赤~マゼンタ領域に対し、例えば、Blue 項目で設定したパラメータは一切影響を与えません。また Magenta 項目で設定したパラメータは、マゼンタと関係ない相対的色領域に対して、一切反映されません。

 因みに、上の例示の場合、マゼンタのグリーン値以外は動かしていませんので、この式は、r および b 値に関しては値は変わりませんが(動かさない場合、r もしくは b 項以外は 0.0 になり、元の r もしくは b のみ 1.0 が掛けられるため)、g値に関しては

rgb[g] = R元値 * (red補正値[g] - blk補正値[g]) + blk補正値[g] + G元値 * (wht補正値[g] - mag補正値[g]) + B元値 * (mag補正値[g] - red補正値[g])

ここで、仮に元の rgb 値が [0.8, 0.3, 0.5]だとすると...

rgb[g] = 0.8 * (0.0 - 0.0) + 0.0 + 0.3 * (1.0 - 0.782) + 0.5 * (0.782 - 0.0)

   = 0.0 + 0.065 + 0.391

   = 0.564

となります。調整前は、0.3 でしたので、この (相対的にマゼンタである) ピクセルの G 値が上昇する > マゼンタ被りが解消する、というわけです。

 なおこの例の場合、変換後の green 値に対しては、元の green 値と green の調整パラメータのみならず、元の b 値も影響を与えています。元の r 値は g 値に影響を与えていませんが、パラメータの設定によっては、元の r 値も変換後の g 値に影響を与える可能性があります。

 また、Magenta 項目で設定したパラメータは、赤ーマゼンタ領域以外に、マゼンター紫ー青領域にも反映されます。

----

■本スクリプトを使う意味

 更に機能的な点から見ると、本スクリプトは、私が ImageJ 用に開発した相対RGB色マスク作成ツールを使ってやろうとていることと、実は目的は同じです。つまり、相対的に、Red, Green, Blue, Cyan, Magenta もしくは Yellow である領域に対し、それぞれ色調整を行うことです。

 但し、私の作成したツールの場合、それぞれの相対色領域に対し、別々にマスクを作成し、それぞれ編集操作を加えなければなりません。この CTL スクリプトだと、一挙に 6 つの色領域に対し、パラメータ操作を加えることができます。

 一方、この CTL スクリプトに対して、私のツールの方が有利な点があります。このCTL スクリプトの方は、6つの三角錐色領域を判定する閾値が固定されているので、この色領域の範囲も固定されます。しかし私のツールの方は、色領域を判定する閾値を自由に動かすことができるので、各色領域も画像に応じて自由に調整できます。この点で、私の相対的RGB色マスク作成ツールを使ったほうがより柔軟な編集が可能になります。

 そして、人間の色認識は、絶対値ではなく、相対的に決まりますので、色領域を動かせたほうが良い場合があります。その点で私のツールを使う優位点があります。

 とは言え、相対的色領域の範囲を調整する必要がなければ、本 CTL スクリプトはより簡便に編集ができるという点で便利です。

 

------

■実際に適用してみて

 そこで、実際に B チャンネル補正法を掛けた画像の追加補正に使ってみました。以下の画像のマゼンタ補正と緑の補正を試してみました。

補正元

 下が適用結果です。

補正後

 緑の補正に関しては Tetrahedral Color Warping (RGB) を使うよりも、単純に類似色でマスク指定をして、黄色味を増すほうが良いようなので、それを適用し、マゼンタ補正のみ Tetrahedral Color Warping (RGB) で補正を掛けました。空などは良い感じで補正できていますが、左下端のバラストはちょっと黒くなりすぎています。

 おそらくリニア RGB 色空間で動いているので、ハイライト域に比べシャドウ域の知覚的補正適用量が大きくなってしまうためと思われます。

 このまま使うよりも、何か手を入れて使いたいですね。