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

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

ImageJ対応 相対RGB色マスク画像作成ツール 新バージョン公開 (輝度マスク作成機能追加)

 4月に公開した汎用色マスク画像作成ツールですが、今回新バージョンを公開します。なお、今回のバージョンから「相対RGB色マスク画像作成ツール」と名称を改めます。また英語名称も、Relative_RGB_color_mask_maker とさせていただきます。名称を何度も変更してすみません。以前のバージョンではマスクを作成する輝度範囲はR, G, Bチャンネル以外にRGBを合成した輝度も選べましたが、グレースケールの色マスク画像自体は Cyan, Red, Magenta, Green, Yellow, Blueの6種類のみとなっており、輝度(Luminosity)マスクの作成は選べませんでした。しかし今回新たに選択肢として輝度マスク (Luminosity) も選べるようにしました。なお、この輝度マスクの作成方法は、以前公開した輝度マスク作成ツールによって作成される輝度マスクとは異なります。

0. 今回追加した輝度マスク作成機能

 まず、色マスクと同様に、マスクの範囲を一定の輝度範囲に限定できます。また輝度範囲判定チャンネルも、RGBを合わせた輝度のみならず、R, G, B, それぞれのチャンネルの輝度を使うこともできます。また作成されるグレースケールの画像マスクに関しては、ポジ画像の輝度マスクに関しては、各ピクセルの輝度の値を v とし、輝度範囲の最低値を l とすると、v-l の画像をマスク画像として出力します。つまり元の最低値が最暗黒になるマスク画像を作成することになります。 ネガマスクはその有効輝度範囲部分の画像を反転したものです (指定範囲外は 0 のまま)。例えば47- 90の輝度範囲で輝度マスクを作るよう指定すると次のようになります。なお、ここで使われるグレースケールの輝度は、gray=0.299 x R + 0.587 x G + 0.114 x B でウェイト付けされています(単純に(R+G+B) /3でグレースケールを求める場合は明度 Lightness とします)。

f:id:yasuo_ssi:20210625105613p:plain

図0-1. 47以下を0とし、それ以外は元の輝度値 - 47 を新たな輝度値としたポジマスク画像

f:id:yasuo_ssi:20210625105727p:plain

図0-2. 輝度範囲を47-90に制限した二値マスク

f:id:yasuo_ssi:20210625105850p:plain

図0-3. 上の二つを合成した最終的な輝度マスク (ポジ)

f:id:yasuo_ssi:20210625110219p:plain

図0-4. 同じ輝度範囲のネガマスク

 なお、輝度マスクに関しては、色の閾値に相当するパラメータが無効ですので、マスクの明るさを調整したい場合は、透過度の係数 (Mask Transparency Factor)を指定して調整してください。係数を上げると明るく(透過度が上がる)なります。

 

 なお、本ツールの当初の開発意図については、2021/4/10公開時の記事をご参照ください。なお、今回公開のバージョンを Ver. 0.1 とします。

 

 

1.ダウンロード&インストール

 こちらのリンクからダウンロードして下さい。また当然ながらすでにImageJ (Fiji distribution) がインストールされていることが前提となります。ダウンロードしたファイルを解凍し、ImageJ のplugins フォルダにコピーしてください。また、これ以外に、GIMPに画像ファイルを任意のレイヤーにマスクとして貼り付ける、私が作成したGIMPプラグインをインストールされていない方は、こちらのページをご覧になってインストールされることを強くお勧めします。

 なお、本ツールで作成した画像はPhotoshop等その他レイヤー & マスク編集をサポートするフォトレタッチソフトでも活用できます。

2. ツールの使用方法

 以下、次の写真の緑 (植物) 部分のくすみを改善するためのマスク画像を作成する、という前提で使用方法を説明していきます。この写真は以前赤変褪色ポジフィルムのサンプルとしてお見せしたもので、赤変褪色したポジフィルムをフィルムスキャナ純正ドライバのDigital ROCを掛けて補正スキャンしたものです。

f:id:yasuo_ssi:20201106215419j:plain

図2-0. サンプル画像

1) ImageJ (Fiji) を起動し、Plugins メニューから本プラグイン(RGB channel mask maker)を起動します。

f:id:yasuo_ssi:20210625000654p:plain

図2-1 プラグインの起動


2) するとファイル選択ダイアログが出るので、マスク作成元となる画像を選択します。

3) 画像ファイルを指定すると、ファイルを読み込み、以下の対象色チャンネル選択画面に移ります。

f:id:yasuo_ssi:20210401232018j:plain

図2-2. 色チャンネル選択画面

[Select Target Channnel for Mask]はグレースケールのマスク画像を作成する色チャンネルの選択で、Luminosity, Cyan/Red, Magenta/Green, Yellow/Blue (つまり、輝度, R, G, Bチャンネル) のどれかを選択します。緑色部分透過マスクを作りたい場合は、 Magenta/Green (Gチャンネル)を選択します。

[Select Target Channnel for deciding upper & lower threshold] はマスクが有効な輝度の範囲を決定するため(つまり二値のマスクを作成するため)のチャンネルを選択します。選択肢はLuminosity (以前はRGBtoGRAY), Blue, Red, Green の4つです。通常は上と同じチャンネルを選択しますが、敢えて異なるチャンネルを選択することも可です。

f:id:yasuo_ssi:20210401232602j:plain

図2-3. パラメータ入力画面

4) 次に、マスクの具体的なパラメータ入力画面に移ります(図2-3)。

デフォルト状態ですと、Yellow, Cyan もしくは Magenta 部分を透過するマスクを作成する状態になっています(※注意: 透過する部分→マスクを貼り付けたレイヤーの元画像を見えるようにする部分。逆に不透過の部分は、元画像を見えなくし透明化する部分。紛らわしいので注意)。

一番上、[ x  ( x' )Mask Threshold] は、x 色 マスク (もしくはその補色  x' マスク) の、どこからを透過させるか決定する閾値を決めるパラメータです。パラメータ値のスケール表示は、8bit相当(0~255)となっていますが、16bit画像でも8bit画像と同じ値で問題なく設定できます。前の画面で、Magenta/Greenを選んでいますので、ここはいま表示がMagenta (Green) になっています。その前提で説明を進めていきます。0に設定すると、Gチャンネルの値と、R と B チャンネルの平均値を比較して、Gチャンネルがそれを下回るところから透過させて(画面上は白っぽく)いきます。式でいうと (r + b) /2 - g で各ピクセルの値を決定します。この閾値を 10 とか 20に引き上げると、ややマゼンタでないところから透過を始めることになります。式でいうと、閾値をα とすると ((r + b) /2  - g) + α つまり透過量を 閾値を 0 に設定する時よりも α 引き上げる、ということに等しくなります。端的に言うと値を上げるほどマスクの透過量が増し、下げるほど透過量が減ります。

 なお、経験的には閾値を 0 に設定したマスクを使うと、色の境界が強調される傾向にあるので、この閾値はY, B, Cy, Rマスクの場合、10ないし20程度に設定するのが適切な場合が多いです。また、Mg, G マスクの場合は30~40程度が適切なことが多いです。個別の画像において、それらのどの値が適切かは実際にマスクを掛け補正してみて補正の効き具合を見て決めてください。補正の効きが悪いと思ったら、閾値を引き上げてください。ただやりすぎは禁物ですので、寸止めぐらいの補正を心掛けた方が良いと思います。

 なお、この項目は、最初のダイアログボックスで、輝度マスク(Luminosity)作成を選択すると、無効になります。この場合、パラメータ入力ダイアログ上で以下のように"This field is not available for Luminosity Mask"と表示されます。ここに値を入れても無視されます。

f:id:yasuo_ssi:20210625114539p:plain

図2-3-1.  Luminosity Mask作成を指定した場合のパラメータ入力ダイアログ

 この場合、マスク自体の明るさ(透過度)を上げるときは、[Mask Transparency Factor] を調整してください。1より大きい値を入れると明るさが上がります。また1より小さい値を指定すると暗く(透過度が下がる)なります。

 次のチェックボックス[Mask invert for x' mask] はマスク画像を反転し、デフォルトの色の補色を透過させるマスク画像を作成するよう指定するためのチェックボックスです。この例では x' のところが、Green になっています。式でいうと、Magentaマスクが ((r + b) /2  - g) + α だったのに対し、チェックをつけると、g -((r + b) /2) + α の式でGreen部分を透過させるマスク画像を作ります。チェックをつけないとMagenta 透過マスクになってしまいます。

 次のスライダー、[upper threshold of mask]、[lower threshold of mask]、は前のダイアログで選択したチャンネルに基づいて (つまり今のプレビュー画面に表示されているチャンネルです)、マスクが有効な範囲の閾値を設定します。スライダーを動かすと以下のようにプレビュー画面が二値化されます。upperは、マスクが有効な閾値の上限、lowerは閾値の下限になります。透過する部分が白、不透過の部分が黒で表示されます。

 この例では、最終的に補正したいのは、木の緑がある部分ですので、木の緑全体がなるべくマスクの透過領域(白の部分)に含まれ、補正する必要がない部分はなるべく不透過領域(黒の部分)に含まれるようにスライダーを動かして閾値を設定します。

 因みに、一番上の[ x  ( x' )Mask Threshold]での閾値とこちらの閾値は、閾値のスケール自体は同じですが、上は相対値で閾値を決めているのに対し、こちらは絶対値で範囲の閾値を決めている点が異なっています。

 なおプレビュー画面は横幅1200ピクセル、ビット深度は8bitに固定されていますが、これは実際のファイル加工に影響を与えません。プレビューの際に実際の画像を見せると処理が重くなるので、それを避けるために小さい画像でプレビューさせています。また閾値の数値も8bitの値で示していますが、16bitの画像であれば、実際の加工時にはちゃんと値を変換して適用されます。

 その下に[preview]チェックボックスがありますが、これを外すとスライダーを動かしてもプレビュー画面に反映されません。

 [Show working windows?]は、プラグイン実行中作業ウィンドウを表示するかしないかを決定します。

5) 指定が終わると、プラグインが走り始め、もし作業ウィンドウの表示をオンにしていれば次のように、ウィンドウを表示しながら作業を進めていきます。

f:id:yasuo_ssi:20210401232621j:plain

図2-4. プラグイン動作中

6) プラグインが終了すると元画像と同じフォルダに以下の3種類のファイルができます。originalfilename のところには元画像のファイル名が入ります。

originalfilename_Mask_Thr_CL+z_x4.tif

 閾値 +z の色補正マスク (CL の部分には色の符号 Y, Mg, Cy, B, G, R, Posi, Nega のいずれかが入る。緑の補正マスクならG となる。また、Posi, Negaは輝度マスクを指定した場合) [グレースケール画像]

originalfilename_L_Zonex-y_Mask.tif

 明るさの閾値が x から y の範囲の明るさのゾーンマスク [二値化画像]

(L の部分には、Gray, R, G, Bのいずれかが入る)

originalfilename_L_Zonex-y_CL+z_Mask_Binded.tif

 上の2つの画像を合成して作成した、有効範囲が、輝度閾値 x から y に限定された、閾値 +z の色補正マスク (L の部分には、Gray, R, G, Bのいずれかが、CL の部分には色の符号 Y, Mg, Cy, B, G, R, Posi, Nega のいずれかが入る)

f:id:yasuo_ssi:20210401232951j:plain

図2-5. Gチャンネル二値化画像マスク (透過範囲41~175)

f:id:yasuo_ssi:20210401233007j:plain

図2-6. 緑色補正用グレースケールマスク (色閾値 +10)

f:id:yasuo_ssi:20210401233024j:plain

図2-7. 二値化画像とグレースケール画像を合成したマスク画像
透過範囲 41~175, 色閾値 +10

7) ここでは最後の図7のマスク画像を緑色部分を補正するためのマスクとして活用します。なお、まじめにやるなら補正対象ではない、電車や発電所、道路の部分は、マスク編集作業で塗りつぶした方が良いですが、そこそこ透明度が低いので、手抜きでそのまま使ってしまいます。

 なお、参考までに、閾値を20に引き上げたマスク画像もお見せします。

f:id:yasuo_ssi:20210402221745j:plain

図2-8. 二値化画像とグレースケール画像を合成したマスク画像
透過範囲 41~175, 色閾値 +20

 図7よりもマスクが明るくなっているのが分かると思います。こちらをマスクとして使うのであれば、コンクリート部分や電車部分はマスク編集で黒く塗りつぶしたほうが良いでしょう。

3. マスク画像を活用した画像編集

1) まず補正したいオリジナルファイルをGIMPで読み込みます。

2) オリジナル画像のレイヤーを複製し、複製したレイヤーに、ImageJで作成したマスク画像 (上の図7) をマスクとして貼り付けます。なお、画像ファイルをGIMP上の任意のレイヤーにマスクとして貼り付けるプラグインを導入していますと、面倒な操作なく簡単に貼り付けられます。

3) マスクを張り付けたレイヤーに対して、例えばトーンカーブなどを用いて、G, Rの出力を引き上げ、Bを引き下げると、下図のように、くすんでいた緑の部分が明るくなり、黄緑に近づきます。

f:id:yasuo_ssi:20210401233755j:plain

図3-1. マスクを使って色彩補正中

 更に、このツールを使ってもうちょっといろいろマスクを掛け、さらにRawTherapeeに読み込ませて、より鮮やかに仕上げてみたのが下の結果です。GIMP上では、レイヤーマスク編集作業も行い、緑改善レイヤー、電車の青色改善レイヤー(主としてB値を引き上げ)、電車のクリーム色および鉄橋の鉄錆色改善レイヤー(主としてR値引上げ)、空色改善レイヤー(主としてB値の引き上げ)の4つのレイヤーを作って補正しました。GIMP上で補正したものをRawTherapeeに読み込ませて、色のニュアンスやコントラストの改善を行いました。

f:id:yasuo_ssi:20210405172506j:plain

図3-2. 最終調整結果

f:id:yasuo_ssi:20210405173217j:plain

図3-3. 調整前 / 調整後 比較

 因みに、RawTherapeeを使ってレイヤー編集を行わず、単純に彩度を上昇させた(霞除去+自然な彩度)結果はこんな感じです。

f:id:yasuo_ssi:20210405183848j:plain

図3-4 レイヤー編集を行わず単純にRawTherapeeで彩度上昇を図ったケース

 RawTherapeeで霞除去と自然な彩度を使って彩度を上げ、さらにコントラストも改善を図っています。これも比較しなければそんなに悪いように見えませんが、木々の色は、本来もう少し黄緑に近づけて明るくしたいところが、調整できないのと(当然ですが)、電車の青がちょっと不自然に鮮やかになっています(レイヤー編集を行った画像に比べ、Bに対するGの値が相対的にやや高い)。青は本来の横須賀線色(クリーム1号+青色15号)を知っている人には若干違和感のある色です。あるいは70系登場時の青2号に近いかもしれません。木々の鮮やかさ、明るさは、もうちょっと上げ気味にしたいのに対し、電車の方はもう少し抑えたいというところかと思います。微妙な差ですが、細かくマスクを使ったレイヤー編集を行ったほうがより自然に見えるのは間違いありません。

 因みに、元々のフィルムは下記のような状態でした。補正結果と見比べてください。赤変フィルムがここまで復活できました。Photoshopの自動カラー補正を掛けてダメだったら、これ以上補正は無理と思考停止している方も多いと思われますが、様々な補正ツールを駆使すると、まだまだ補正の余地があります。

f:id:yasuo_ssi:20201106215309j:plain

図3-5. オリジナルの赤変褪色状態
(無補正でフィルムスキャン)

------------------

4. 複数の色マスクの合成

 さらに、複数の色マスクを複合してマスクを作ることも考えられます。例えば赤紫色を透過するマスクを考えてみましょう。以下の youtube 画面のPCキャプチャ画像に対して赤紫色マスクを作成してみます。

f:id:yasuo_ssi:20210402224123j:plain

図4-0. マスク作成元画像

 赤紫色は、青と赤の混合です。従って、本ツールを使って赤マスクと青マスクを作成し合成すればよいことになります。以下、本ツールで作成したマスク画像です。

f:id:yasuo_ssi:20210402224305j:plain

図4-1. 赤マスク

 上は赤のグレースケールマスク画像です。

f:id:yasuo_ssi:20210402224145j:plain

図4-2. 青マスク

 引き続き青のグレースケールマスク画像です。

 この両者を合成するにはImageJのImage Calculatorコマンドを使います。まず、ImageJであらかじめ、この2枚のマスク画像を読み込んでおきます。次にImageJのメニューの[Process]→[Image Calculator]を選んで起動します。すると下記の画面になります。

f:id:yasuo_ssi:20210402224415j:plain

図4-3. イメージ・カルキュレータを使ったマスクの合成

 Image1とImage2にそれぞれ赤マスク、青マスク画像ファイルを選びます (順番はどちらでも良いです)。Operation に min を選びます(より暗いほうに合わせて合成するという意味)。そうすると、赤マスク∩青マスク の合成画像が作成されます(下図)。

 

f:id:yasuo_ssi:20210402224204j:plain

図4-4. Red mask ∩ Blue mask

 赤マスク画像と比較して見てみると、正面の赤紫の部分はほぼ赤マスクと同じですが、右側のサムネイル画像を見ると、赤系だけれども赤紫ではない画像はマスクされているのが分かります。ちゃんと赤紫透過マスクになっています。これに名前を付けて保存すればOKです。

 このマスクをGIMPで使って赤紫を青っぽくしてみます。

f:id:yasuo_ssi:20210403165713j:plain

図4-5. 上のマスクを使って赤紫を青っぽく編集

----------------------

 このように活用することによって、ほぼ色域指定と同様なマスクを作ることができます。例えば、青緑透過マスクなら青マスク x 緑マスク、黄緑~鶯色透過マスクなら 緑マスク x 赤マスクといった具合です。

 またBチャンネル再建法の追加補正に使うのであれば、GとB値の接近を主に補正することになると思いますので、青マスクもしくは緑マスクの出番が多くなるでしょう。肌色を補正する場合は赤マスクを使って、G値を引き上げ、B値を引き下げる(GとBが近接すると褐色に近くなる)という編集になるかと思います。

 またパラメータで色域を指定できる点では、色域指定コマンドよりやりやすい面もあると思います。いずれにせよ、本ツールによって、GIMPで色域指定を使って選択範囲を指定した時に長時間入力を受け付けなくなるという問題を回避することができます。

------------------

 なお、本記事で紹介した写真補正技法やソフトウェア (Plug-in) は、個人的および非営利用途であれば、自由に使っていただいて構いませんが、本技法を使って何らかの成果 (編集した写真等) を公表する場合は、本記事で紹介した技法を使った旨クレジットをつけて公表していただくことをお願いします。

 また、本ソフトウェアは現状のまま提供されるものし、作者はこれを使ったことによるいかなる損害補償等にも応じられないことを了解の上使っていただくものとします。
 但し、もしソフトウェアのバグがありましたら、ご連絡いただければなるべく改善するよう努めたいと思います。