アメリカ国立衛生研究所(NIH)が開発したフリーの画像処理ソフト、ImageJに対応した、輝度マスク Luminosity Masks を簡単に作成できるスクリプトを公開します。本スクリプトで作成した画像はGIMPやPhotoshop等レイヤー編集ならびにレイヤーマスクをサポートしたフォトレタッチソフトでレイヤーマスクとして利用でき、輝度マスクを使った写真効果の編集に活用可能です。
ちなみに、輝度マスクそれ自体の説明については、例えば下記のサイトをご覧ください (とりあえず Google で検索してトップに出てきたサイトを示しています)。
また、輝度マスク Luminosity Mask という言葉は、ネットを調べている限り、Katrin Icemannが2005年に出した、"Photoshop Masking & Compositing" という本に既に出ていますが、その前には出てきません。この本ではコントラストが高すぎる写真データに対して、輝度マスクを使って諧調を救ってコントラストを下げる技法を紹介していますが、これらの技法はIcemannが開発した技法ではなく、Stephen JohnsonとJeff Scheweの教示を受けたと書いています。2006年には、Tony Kuyperが、完全に今のLuminosity mask と同じ手法を解説したサイトを公表しています。また、2009年にMichael Reichmanが発表したらしい (但しなぜか(c)表示は2004年になっている) "Masking by Numbers" という記事には、考え方は同じですが、Luminosity Maskという用語を使わず Tone-based Maskという用語を使っていました。これらにさかのぼる2000年には、Hewlett-Packard社のNathan Moroney による'Local Color Correction Using Non-Linear Masking'という論文が発表されています。この論文の主張の要点は、写真の補正を行う際、全画面均一の補正 (グローバル補正) が有効でない場合、局所的な補正 (ローカル補正) の必要があるが、その局所的な補正を行うツールとしてのグレースケール画像マスクの有効性を主張するもので、ほぼ考え方としては輝度マスクと同じです。ただ現在の輝度マスクと異なる点は、グレースケール画像をそのまま使うのではなく、ガウスぼかしを掛けて使うことが提案されている点です。ともあれ、この技法は、どうやら2000年から2004年の間に開発された技法のようです。また風景写真に広く応用されるようになったのにはMichael Reichmanの影響が大きいのかもしれません。
また、直接関連があるかどうか分かりませんが、Photoshop上で輝度画像データを使ってCCDを使って撮られた天体写真のS/N比を上げるという技法は2001年に発表されており*1、その論文には、この技法のアイディアは、岡野 久仁彦とRobert Dalbyによって別々に考案されたと書いてあります。天体撮影用の冷却CCDカメラではR, G, B, とL(輝度)画像を別々に出力するようで、RGB画像は赤外線の影響除去のためにフィルタリングされるためS/N比が低い画像しか得られないのに対し、L画像はそれがないためS/N比が高く、これをうまく利用してS/N比の高いカラー画像を得るテクニックのようです。
なお、輝度マスクは単にレイヤーマスクに輝度*2を応用するという以上の意味はなく、輝度マスクはこう作るべきという決まりはないようです。ただ、多くのサイトは (上のサイトもそうですが)、Photoshopでの作業手順を紹介しているだけです。この作業手順で作られる画像はどう定義されるのか説明しているサイトは見当たらなかったので、自分でPhotoshopで手順通り輝度マスクを作ってみました。で結局Photoshopでやっていることは、明るい領域のマスクは、ポジ画像を輝度グレースケール化し、さらに段階を追って同じ画像を掛けて256で割り、また暗い領域のマスクは、輝度グレースケール化したポジ画像をネガに反転し、さらに段階を追って同様の処理を行っているらしく、さらに中位域のマスクは、それぞれの段階ごとに明るい領域マスクの明るい部分から暗い領域マスクの暗い部分を差し引いた差分(厳密にいうと両者を比較し、より暗いほうの値を取る)であるらしいことが分かりました。以下この方式を仮にPhotoshop方式と呼びます。
他には、GIMPの公式サイトでPat Davidが解説している輝度マスク (以下、仮にPat David方式と呼びます) があります*3 Pat David方式は、明るい領域マスクは、輝度グレースケールポジ画像から段階を追ってネガ輝度グレースケール画像を段階を追って引き、暗い領域マスクは、逆にネガ画像からポジ画像を段階を追って引いていきます。Pat Davidの説明で問題があるのは中位域マスクです。中位域の1段階目のマスクは、ポジグレースケール画像とネガグレースケール画像のintersectionという説明は合っていますが、2段階目以降はPat Davidの説明通りだと真っ暗になってしまい、Pat DavidのGIMPサイトでの説明ページにサンプルとして掲げているマスク画像に一致しません。結局、中位域の2段階以降の画像は、中位域の画像にさらにどんどん中位域の画像を加算してやると、サンプル画像に一致することが分かりました。つまり明るい領域と暗い領域のマスクは段階を追って暗くなっていきますが、中位域のみ段階を追うごとにマスク画像が明るくなっていきます。
他にもいろいろ方式は考えられると思いますが、とりあえずこの2方式に焦点を当てます。
で、本スクリプトがやろうとしていることは、GIMPやPhotoshop内で作っていると七面倒くさいそれぞれの段階の輝度マスク画像をImageJを使って一挙に作成してしまうわけです。実際に、GIMPやPhotoshopでこれらの画像をレイヤーマスクとして使う場合は、これらの画像を適当な画像ビュアーで開き、コピー&ペーストで、GIMPやPhotoshop等にレイヤーマスクとして貼り付けていただければOKというわけです。
■スクリプトのダウンロード
以下のリンクからダウンロードして下さい。Photoshop方式 (A) とPat David方式 (B) が別々になっています。ZIPで圧縮されていますので、解凍してください。一つのZIPファイルに、8bit画像用と16bit画像用が含まれています。(A)は、Photoshop方式とありますが*4、出来た画像がPhotoshop専用というわけではありません。また、上の推測に基づいてアルゴリズムを組んでいますので、100%Photoshopと同じ結果が得られているか保証の限りではありません。(B) の画像をPhotoshopに適用しても、(A)の画像を GIMPに適用してもかまいません。
Luminosity Mask Maker A (Photoshop方式)
Luminosity Mask Maker B (Pat David方式)
(2021.2加筆)
2021.2にバージョンアップしました。新バージョンの内容は、例によって16bit / 8bit版の統合と、Type A (Photoshop方式) / Type B (Pat David方式)の統合です。これにより一本のプラグイン・スクリプトになりました。作成した画像はGIMPやPhotoshop等レイヤー編集をサポートするフォトレタッチソフトで、マスクとして貼り付けて活用してください。
最初にファイル選択ダイアログが出た後、さらにパラメータ入力ダイアログが出て、16/8bitの選択、並びに Type A / Bの選択ダイアログが出ます。
ダウンロード先
新バージョン Luminosity Mask Maker
なお、ImageJのインストール方法は以下をご覧ください。
■利用方法
ImageJ (Fijiディストリビューション)でファイルを開きます。ImageJのインストールについては、こちらの記事をご覧ください。メニューの[File]→[Open]で、このファイルを選んでください。スクリプトファイルを読み込むときに何らかのエラーメッセージが出るかもしれませんが無視して構いません。するとPlug-inを編集するエディタが立ち上がります。そこで、[Language]にPythonを指定してください。実行させるときはエディタのメニューの[RUN]を選ぶと実行します。またプラグインとして登録して実行することも可能です。
開発環境はWindowsですが、おそらくMacやLinuxでも大丈夫だと思います。逆にトラブルが出たときにお知らせ頂けますと幸いです。
実行すると、補正元画像を選択するダイアログが出て、ファイルを指定すると、以下の画像がオリジナルファイルと同じフォルダに出力されます。
以下、[ファイル名]はオリジナルファイル名(拡張子付)を指します。
[ファイル名]_L0~L4.tif
明るい領域用マスク画像。段階ごとにL0からL4までの5つのファイルがある。但し、スクリプト(B)では L0~L2まで。
[ファイル名]_D0~D4.tif
暗い領域用マスク画像。段階ごとにD0からD4までの5つのファイルがある。但し、スクリプト(B)では D0~D2まで。
[ファイル名]_M0~M4.tif
中位領域用マスク画像。段階ごとにM0からM4までの5つのファイルがある。但し、スクリプト(B)では M0~M2まで。
以下は、私が撮影した写真を使った、実際に作成されるマスク用画像の例です。左の列からL, M, D画像で、下に行くにつれ番号が増えていきます。
オリジナル画像
スクリプトBの方がAよりもコントラストの高いマスク画像が得られていることが分かります。なお1段階目、L0, M0, D0は、両者とも同じ画像になります。
なお、スクリプト(A)と(B)は、同じファイル名を用いていますので、混用する場合は、1つのスクリプトでファイルを作成後、そのファイルをサブフォルダを作って退避させてください。そうしないと、もう一つのスクリプトを走らせた後、ファイルが上書きされてしまいます。
なお、以下で、GIMPおよびPhotoshopで、レイヤーマスクとしてこれらの画像を貼り付ける方法について説明します。
■GIMPの場合
1) マスクとして貼り付けたい、画像レイヤーにアルファチャンネルがない場合は、レイヤーダイアログから、そのレイヤーの上でマウスの右ボタンを押し、出てきたメニューから[アルファチャンネルを追加]をクリックして、アルファチャンネルを追加します。さらに[レイヤーマスクの追加]を押し、レイヤーマスクを追加します。
2) できたマスクのサムネイルの周囲が白くなっているのを確認(あるいは右ボタンメニューから[レイヤーマスクの編集]にチェックをついているのを確認)します。
3) 適当な画像ビュアーでImageJで作った、マスクとして貼り付けたい開き、クリップボードにコピーします。
4) GIMP上でクリップボードから貼り付けると、マスクとして貼りつきます。
5) うまく貼りつくと、レイヤーダイアログのマスクのサムネイル画像が真っ白から、縮小した貼り付けた画像が表示されるはずです。
■Photoshopの場合
方法1:
1) マスクをつける先となる画像があるレイヤーを選択します。そうしたらレイヤーダイアログの一番下にある、左から3番目のアイコン(日の丸が反転したようなアイコン)、[レイヤーマスクを追加]をクリックします。
2) 追加したら、右側のマスクのサムネイル画像をクリックし、白い枠がマスクのサムネイル画像の周りについているのを確認します。これでマスク編集モードに入ります。
3) レイヤーマスクを追加し、マスク編集モードにしたら、[チャンネル]タブをクリックし、グレーチャンネルの本画像の目のアイコンを外し、マスクのチャンネルの方に目のアイコンを表示し選択します。すると真っ白なマスク編集画面が現れます。
あるいは、マスクのサムネイル画像の上でAltキー(MacではOptionキー)を押しながらクリックしてもマスク編集画面に入れます(再度、Altキーを押しながらクリックすると元に戻ります)。
4) 適当な画像ビュアーでImageJで作った、マスクとして貼り付けたい開き、クリップボードにコピーします。
5) マスク編集画面にクリップボードから画像を貼り付けます。
6) うまく貼りつくと、[レイヤー]タブのマスクのサムネイル画像が真っ白から、縮小した貼り付けた画像が表示されるはずです。終わったら、[チャンネル]タブの目のアイコンを元通りに戻すことをお忘れなく。
方法2:
1) 何らかの画像ブラウザで、マスク作成ツールで作成したマスク画像を開き、クリップボードにコピーします 。
2) Photoshopで編集元の画像を開きます。
3) ツールバーの[クイックマスクモードで編集]アイコンをクリックして、クイックマスクモードに入ります。
4) クリップボードにコピーしたマスク画像をペーストします。すると画像が赤く表示され貼りつきます(下図)。この状態でマスク画像の編集が可能です。
5) [クイックマスクモード]を解除し、ペーストした画像を選択範囲に転換します。
6)メニュー→[新規調整レイヤー]→必要な調整レイヤーを選び、調整レイヤーを作成すると、調整レイヤーに選択範囲がマスクとして貼りつきます。
------------------
------------------
なお、本記事で紹介した写真補正技法やソフトウェア (Plug-in) は、個人的もしくは非営利用途であれば、自由に使っていただいて構いませんが、本技法を使って何らかの成果 (編集した写真等) を公表する場合は、本記事で紹介した技法を使った旨クレジットをつけて公表していただくことをお願いします。
また、本ソフトウェアは現状のまま提供されるものし、作者はこれを使ったことによるいかなる損害補償等にも応じられないことを了解の上使っていただくものとします。
但し、もしソフトウェアのバグがありましたら、ご連絡いただければなるべく改善するよう努めたいと思います。
Keywords: 輝度マスク, ルミノシティ・マスク, Luminosity Mask, ImageJ, GIMP, Photoshop
*1:Robert Gendler, 2001, 'Color CCD Imaging with Luminance Layering', "Sky and Telescope". Vol. 102, No1, pp. 133-9, July, 2001
*2:輝度とは、カラー画像を目で見た感じ方に近い形でグレースケール化することです。単純にカラー画像をグレースケール化することを考えると、例えば、R, G, Bの明るさの平均値を元にグレースケール化する、ということが考えられますが、それは人間の目で見た明暗の感覚と多少異なります。そこで、輝度によるグレースケール化の場合、Gの重みを6~7割程度、Rの重みを3~2割程度、Bの重みを1割程度にしてグレースケールの明暗度を決定します。ちょうどフィルムカメラの時代、モノクロフィルムで撮影するときにYellowフィルターを使いましたが、それと考え方は同じです。具体的にどう重みづけるかは、画像処理ソフトによって多少式が異なり、ImageJの場合は、"Weighted RGB to Grayscale Conversion" を使う場合、gray= 0.299 x red + 0.587 x green + 0.114 x blueで重みづけています(こちら参照)。GIMPの場合は、Luminance = (0.22 × R) + (0.72 × G) + (0.06 × B) です(こちら参照)。Photoshopの場合は、ImageJと同じ重みづけを使っていると書かれたサイトがありましたが、公式サイトで定義が探せませんでした。なお、ここで公開している輝度マスク作成ツールではImageJの重みづけをそのまま使っています。
*3:説明サイトはこちらです。
*4:2段目以降のL, D画像を作成する式は[8bit画像の場合]、v=v*(v/256)、但し v は画像の各ピクセルの255を最大値とする明暗を示す値です