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

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

GIMPの色域指定選択の問題点を回避する... ImageJ対応 汎用色チャンネルマスク画像作成ツール公開

お知らせ

 このツールをバージョンアップして「相対RGB色マスク画像作成ツール」として新たに公開しました。以下のページをご覧ください。(2021.7.3)

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

yasuo-ssi.hatenablog.com 

 なお、ImageJのインストール方法自体については (但し Windows)、以下をご参照ください。(2022.1)

yasuo-ssi.hatenablog.com  ------------------------------

 このツールの機能強化&バグ修正バージョンアップ版を2021.5.8に公開しました。こちらのページをご覧ください。なお、このページのダウンロードリンクも修正済みです。なおバージョン番号は Ver. 0.05 になります。

※修正版のリンクが間違っていたのを修正しました (2021.6.10)。

 

 先週、Bチャンネル再建法 追加補正サポート用マスク作成ツールの使い勝手の悪いところを、プレビュー画面を見ながら閾値を設定できるよう対話型インターフェースを備えた形に改善して公開しました。

 それから、さらに考えて、これを黄色/青色部分補正マスク作成(つまりBチャンネルを使ったマスク作成)のためだけではなく、他の、RチャンネルやGチャンネルを使ったマスクも作成できるよう汎用化を考えました。つまり、R, G, Bそれぞれのチャンネルの画像を使ったマスク画像を作成できるように改良してみました。

 なぜこう考えたかというと、もともと、Bチャンネル再建法 追加補正サポート用マスク作成ツールは、Bチャンネル再建法で補正しきれない部分を、色域指定等のマスクを使って追加補正する代わりに、パラメータ入力で補正マスクを作成したほうがやりやすいのではないか、というところから出発したのでした。しかもGIMPは、色域指定を使って選択範囲を作ろうとすると時間がかかる場合があります。実際に私もこれで困っています。これがフルHD程度(横幅1920ピクセル程度)であれば、多少時間がかかる程度で終わるのですが、最近のデジタルカメラの標準である 6000 x 4000ピクセル以上の画像だと、選択範囲を作り終わるまで数分(指定範囲の形状によっては10分以上)待たされることがあります。境界を滑らかにしたり、ぼかすと少し待ち時間は短めにはなりますが... 範囲選択コマンドの実行が非常に遅かったりなかなか表示されない問題点はGIMPのリリースノートでも指摘されているので (原因は過剰に画像の書き換えを行っているせいではないかと書かれています)、開発陣は問題があるという点は認識しているようですが*1、いまだに改善されていません。

 でこの黄変部分補正マスクツールをBチャンネル以外の他のチャンネルにも適用可能にすると、色域指定と全く同じではありませんが、近いことができます。という訳で、大きなサイズの画像をGIMPで編集する際に、汎用色チャンネルマスク画像作成ツールは特に有効なのではないかと思います。 

 

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

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

2. ツールの使用方法

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

f:id:yasuo_ssi:20201106215419j:plain

図2-0. サンプル画像

1) ImageJ (Fiji) を起動し、Plugins メニューから本プラグイン(RGB channel mask maker)を起動します (バグ修正を機にファイル名の Color channel mask maker を RGB channel mask maker に変更しています。図との異同にご注意ください)。

f:id:yasuo_ssi:20210403222014j:plain

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

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

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

f:id:yasuo_ssi:20210401232018j:plain

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

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

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

f:id:yasuo_ssi:20210401232602j:plain

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

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

デフォルト状態ですと、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 に設定したマスクを使うと、色の境界が強調される傾向にあるので、この閾値は 10ないし20程度に設定するのが適切です。10~20のどの値が適切かは実際にマスクを掛け補正してみて補正の効き具合を見て決めてください。補正の効きが悪いと思ったら、閾値を引き上げてください。ただやりすぎは禁物ですので、寸止めぐらいの補正を心掛けた方が良いと思います。

 次のチェックボックス[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 のいずれかが入る。緑の補正マスクならG となる) [グレースケール画像]

originalfilename_L_Zonex-y_Mask.tif

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

originalfilename_L_Zonex-y_CL+z_Mask_Binded.tif

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

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

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

 

 

*1:以下をご覧ください。

www.gimp.org