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

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

GIMP 写真補正テクニック / レイヤーモード: スクリーン - 粒子の荒れを抑えて画像を明るくできる

 Akkana Peck氏の "Beginning GIMP: from Novice to Professional" というGIMPの入門書が良さそうなので入手しました。Apressという、コンピュータ解説書を中心に出しているアメリカの出版社から出ていたものですが、既に絶版になっています。そこで中古をAmazonで入手しました。

 本当は 2014年に出た第3版を購入したかったのですが、中古でも全く在庫がなく仕方なく、2008年に出た第2版を入手しました。Ver. 2.4の時代ですが、2.6の方向性まで見据えた内容になっています。

 結構いい内容なので、絶版になっているのが残念ですが...

 なお筆者による関連ウェブサイトがこちらです。

gimpbook.com また、作者の個人webサイトはこちらです。

shallowsky.com

 本書のなかのAdvanced Compositingとして紹介されている中から、今まで知らなかった写真補正テクニックを紹介していきたいと思います。

 まずは、レイヤーのスクリーンモードについて... この本の中では"Using Screen Mode for Dark Images" として紹介されています。

 通常、暗い画像を明るく補正すると、結構粒子の荒れが目立ちます。しかし同じ画像をレイヤーとして複写し、重ねるときにスクリーンモードを選んで重ねると、粒子の荒れが目立たずに画像を明るくすることができるというのです。

 因みに公式マニュアルではレイヤーモードの解説は下記にあります。

docs.gimp.org

 ここにも当然スクリーンモードは紹介されていますが、ここに説明されているこの式を見てもピンときませんよね。

f:id:yasuo_ssi:20210624143440p:plain

スクリーンモードの式

 因みに、Mが上のレイヤーの画素の値、Iが下のレイヤーの画素の値で、Eがスクリーンモードで重ねたがその値です。要は、255から上のレイヤーの画素を反転した値と下のレイヤーの画素を反転した値を掛けて255で割ったものを差し引いたものが、スクリーンモードで重ねた時の画素の値になるというのですが... もちろん、計算式で書かれている計算自体は小学生でもわかります。しかし計算手続きとして分かるということと、その式の意味を分かることは異なります。簡単な式ではありますが、式の意味はこれを見ただけでは分かりません。GIMPの平滑化が、変褪色した写真の補正に効果があるということがあまり知られていないのも、そのためでしょう。しかし、本書の解説によりますと、上記のような用途に使える、というのです。

続きを読む

ImageJ / Python Tips: ImageJにおけるカラー画像の画像深度の扱いについて

 ImageJの画像の型はImagePlusのgetTypeメソッドで取得できます。その種類は、 現状では、GRAY8, GRAY16, GRAY32, COLOR_RGB, 及び COLOR_256です。GRAY8はグレースケール(もしくは色チャンネル単独)で8bit (0-255の値を取る)、GRAY16はグレースケール(もしくは色チャンネル単独)で16bit (0-65535の値を取る)、GRAY32は浮動小数点を使った32bitの値で諧調を表現します。COLOR_256は、いわゆるインデックスカラーで、gifと同じように色を256色で表現します。COLOR_RGBはRGB3チャンネルでフルカラーを表現します。要注意なのはこのCOLOR_RGBの場合、8bit x 3チャンネルになることです。なぜならRGB各8bitの値を単独の24bitの整数値に割り付けて表現するからです*1

f:id:yasuo_ssi:20211217000744p:plain

COLOR_RGB
Color画像が単独のImageProcessor (ColorProcessor) として扱われている

*1:以下を参照。

syn.mrc-lmb.cam.ac.uk

続きを読む

GIMP / Python Tips: プラグインで[元に戻す]範囲を設定する

 Pythonで作成したGIMPプラグインを実行後、その操作を取り消すと、特に何も設定していなければ、プログラムに書かれている操作過程一つ一つを取り消すことになります。従って、プラグインで指定した操作全体を一挙に取り消すことができません。

 そこで、プラグインデイ指定した操作全体を一挙にキャンセルできるようにするために、gimp-image-undo-group-start と gimp-image-undo-group-end というAPIが用意されています。

 例えば...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

 

from gimpfu import *
def My_Plugin(image)
  pdb.gimp_image_undo_group_start(image)

 

     一連の手続き

 

  pdb.gimp_image_undo_group_end(image)
  return
register(... 以下略

 

とすると pdb.gimp_image_undo_group_start(image) と pdb.gimp_image_undo_group_end(image) の間に挟まれている一連の手続きが、プラグイン実行後、[編集]→[元に戻す]を実行すると、一挙にキャンセルされます。これを書かないと、一連の手続きの一つ一つごとに、[元に戻す]が実行される結果となります。

 

 

 

 

 

軽微な黄変の補正 - 新・黄変ネガカラー写真補正過程例示(7)

f:id:yasuo_ssi:20210310145522j:plain このあたりで、軽微な黄変の補正事例もお見せしたいと思います。オリジナル画像は下記です。

f:id:yasuo_ssi:20210526222349p:plain

オリジナル
3,053,069色

 中央から右より、やや下の位置がわずかに黄変しているのが分かるかと思います。他の部分は問題ありません。この程度だとBチャンネル再建法に掛ける必要はありません。なお今回ファイルの色数をカウントするのにすべてのファイルをadobeRGBに統一して測っています。

 そこで汎用色チャンネルマスク作成ツールもしくはBチャンネル再建法 追加補正サポート用マスク作成ツールを使ってY透過マスクを作ります。

f:id:yasuo_ssi:20210526222644p:plain

Y透過マスク用画像
明度Bチャンネル14-247 / Y閾値+10

 これを黄変部分だけ補正するようにマスクの編集を行います。

f:id:yasuo_ssi:20210526222906p:plain

黄変部分透過マスク

 このマスクを掛けたレイヤーに対し、Bチャンネルをトーンカーブで補正します。

f:id:yasuo_ssi:20210526223022p:plain

Bチャンネル補正中

 さらに赤みもあるようですので、同じレイヤーに対して若干Rを引き下げます。

f:id:yasuo_ssi:20210531134929p:plain

Rチャンネル補正中

 補正が終了したら、出力して終わりです。

f:id:yasuo_ssi:20210531135457p:plain

GIMP上での補正終了
2,819,084色

 色数は若干低下しましたが、これでも十分見られます。念のためdarktableでコントラスト調整を行ってみます。

f:id:yasuo_ssi:20210531140247p:plain

darktableによる補正後
3,073,160色

 今回、露出とフィルミックRGBのみ調整して、ホワイトバランスを含め一切色の調整は行いませんでしたが、オリジナルを超える307万色余りと増えました。なお、RawTherapeeでも、同様に露出とトーンカーブ調整を使ってコントラストの調整を行いましたが、色数はdarktableに負けました。意外にも今までdarktableでどんな調整を掛けてもRawTherapeeより色数が増えることはありませんでしたが、今回はなぜかRawTherapeeを上回りました。どうも色の調整が入らず、コントラストや露出だけの補正を行う場合は darktable、逆に色の調整が入る場合は RawTherapeeの方が優れているような感じがします。

 コントラスト調整効果という点に限っては、伝統的なトーンカーブよりdarktableのフィルミックRGBがより効果が上回っているのかもしれません。

 あるいは、今回入力元のファイルの色数が、今までの画像 (主にBチャンネル再建法適用後さらに補正を加えたの画像)に比べて圧倒的に多いので、入力元がより優れているとdarktableはより優れた効果を発揮できるが、入力元がプアーだとむしろ効果が発揮できないという可能性も考えられます。

 いずれにせよ、今後補正を重ねる中、検証を続けていきたいと思います。

飯田線旧型国電走行写真補正- 新・黄変ネガカラー写真補正過程例示(6) に戻る

 

GIMP / Python Tips: 現在アクティブなimageやdrawableを取得する

 GIMPPython-fuで、現在アクティブなimageオブジェクト (GIMPにおけるimageとは、ほぼ画像ファイルのことを指す) をどうやって取得したらよいでしょうか? つまり、複数のimage つまり画像ファイルが読み込まれている状態で、現在アクティブなimageオブジェクトをどのように指定したらよいでしょうか。実は、GIMPには現在アクティブなimageオブジェクトを取得するAPIがありません。

 GIMPAPIgimp.image_list() というものがあります。これは現在GIMPに読み込まれているimageのリストを取得するAPIですが、例えば

image = gimp.image_list() [0]

とやってimageに現在アクティブなimageオブジェクトが読み込まれるかというと、ノーです。gimp.image_list() [0]とやると、最後に開いたimageが取得されます。また、gimp.image_list() [1]だと、最後から2番目に開いたimageオブジェクトが取得できます。最後に開いたimageがアクティブなimageオブジェクトである可能性は高いですが、必ずしもそうではありません。かといって get_active_image というようなAPIは見当たりません。

 ネットで調べてみると以下のようなQ&Aがありました。

www.gimpusers.com このQ & Aを見る限りは、GIMPに現在アクティブなimageオブジェクトを取得するAPIはなく、単に、

def my_plugin_function (image, drawable):

 と書けば、変数 imagedrawableに現在アクティブなimageオブジェクトやdrawableオブジェクトが取得できるというのですが、その通りやってみてもうまく動きません。いろいろ探した結果、以前見ていた日本語のサイトに正解が書かれていました。

lendl.sakura.ne.jp

 単に、プラグインの引数に

def my_plugin_function (image):

と、imageオブジェクトを入れる変数を指定するだけではだめで、register関数の、プラグインの入力ダイアログを指定する部分で、引数に使う変数について以下のように併せて指定する必要があるようです。

[
(PF_IMAGE, "image", "Input image", None),
],

 こうすると変数imageに現在アクティブなimageオブジェクトが取得され、プラグインに渡されるようです。なお、緑の斜体で表現している変数名は変えることができますが、プラグインの引数と、register関数に書かれる変数名は対応していなければなりません。

 これを入れることで、特にダイアログが開くことなく、現在アクティブなimageが取得できました。ただ敢えてダイアログを開きたい場合はどうやるのかが良く分かっていません。Noneの代わりに何かを入れる必要があるとは思いますが...

 なお、現在アクティブな drawableオブジェクトも同様な方法で取得することもできます(引数に、drawableを指定した上で、Register関数で (PF_DRAWABLE, "drawable", "Input drawable", None), を指定)。しかし、imageオブジェクトに関しては現在アクティブなimageを取得するAPIはありませんが、drawableオブジェクトに関しては、アクティブなdrawableを取得するAPIがあります。

  pdb.gimp_image_get_active_drawable(image)

  pdb.gimp_image_get_active_layer(image)

  pdb.gimp-_mage_get_active_channel(image)

といったAPIがそれです。

 ですので、アクティブなオブジェクトを取得するために上記のことを配慮すべきなのはimageオブジェクトのみと考えてよいでしょう。プログラムの可読性という点でも、APIが用意されているなら、なるべくそれを使ってプログラムを書いた方が良いと思います。

 因みに、上述のQ&A(2012年)の通りにやってうまくいかなかった件ですが、おそらくRegister関数の形式の微妙な変更とかかわっているのではないかと推測します。たぶんGIMP2.8導入(2012年4月)の際に若干Register関数の形が変わったようです。Q&Aはそれ以前のバージョンを前提としていると思います。旧来の形のRegister関数を持ったプラグインでも現行バージョンでは動きますが、Register関数が新しい形式だと、旧来の前提が崩れるのだと思われます。私は新しいRegister関数の形式を踏まえて書いていましたので、おそらくそのためうまく走らなかったのだと思います。

 例えば以前下記の記事で紹介したGIMPプラグインは、上述のQ&A通りの方法でアクティブなimageおよびdrawableオブジェクトを取得していますが、register関数の形がちょっと古い形になっています。

yasuo-ssi.hatenablog.com

 先日、自作のGIMPプラグインをいくつかアップデートしましたが、これは、自分が image = gimp.image_list() [0] でアクティブなimageオブジェクトが取得できるものと誤解していたのを、訂正したためです。

 

yasuo-ssi.hatenablog.com

 因みに、GIMP3.0ではこの辺りどうなるかですが、現在開発中のGIMP2.99ではRegister関数がなくなっているようで、Register関数で指定したことを指定しようとすると非常に面倒くさくなっています*1。おそらくまだPython-fuにおけるRegister関数の仕様が固まっておらず実装されていないためだと思われますが...

*1:以下の記事をご覧ください

yasuo-ssi.hatenablog.com

クモハ114-1503 (1992.6)

 またまた、旧型国電ではないですが、発掘したフィルムの蔵出しです。こちらは1992年6月、小出駅で撮影した115系第1次新潟色 (1987年登場) の編成でクモハ114-1503(新ナカ)です。後ろはクモハ115-1532だったようです。もともとは70系の置き換えとしてTcMMTc編成として製造されたはずですが、民営化の前後で、地方でも編成を短くしてフリークェントサービスを行おうという中で、編成が長すぎることになり、元々MMユニットだったものをMcMcの2両編成に改造して誕生した贅沢オールM編成で、当初はモハ114-1060+モハ115-1017だったようです。新製時は湘南色だったはずです。

 新潟を象徴するN文字が、なぜか微妙にJNRマークに似ているような...

f:id:yasuo_ssi:20210118104216j:plain

クモハ114-1503 (新ナカ)

 

本車の車歴です。

 

1978.6製造 (モハ114-1060 配置新ナカ) → 1986.10 改造クモハ114-1503 (新ナカ)→1987.4 国鉄JR東日本→1999.12 新カヌ→ 2004.3 新ニイ → 2016.5廃車 (出典: レイルラボ

https://raillab.jp/car/63030 )

因みにS3編成の相棒だったクモハ115-1532の車歴は

1978.6製造 (モハ115-1017 配置新ナカ) → 1986.10 改造クモハ115-1532 (新ナカ)で、以下クモハ114-1503に同じです( https://raillab.jp/car/63476)。

 

 

不均等黄変ネガ写真補正技法総覧 - そもそもレイヤー編集って何?

f:id:yasuo_ssi:20210310145522j:plain

  今、不均等に黄変したネガ写真を前にして、写真のデジタル補正の経験もほとんどないのに、どうやって補正したらよいだろうと途方に暮れている方もいらっしゃると思います。この連載記事ではレイヤー編集について分かっていることを前提として書いてきましたが、そもそもレイヤー編集って何、とか、あるいは写真の編集ソフトになぜRaw現像ソフトとフォトレタッチソフトがあるの、その違いは何、という方もいらっしゃると思います。そこで、ここではそれについて簡単に触れたいと思います。

 写真編集ソフトには、GIMPPhotoshop のようなフォトレタッチ系とRawTherapee, darktable、Lightroom 等のRaw現像ソフト系に大きく分かれます。簡単に言うと、Raw現像ソフトの主目的は、デジタルカメラの元ファイルであるRawファイルを「現像」処理すること、それに対し、フォトレタッチ系は、出来上がった写真を如何に加工するかということに主目的があり、本格的なフォトレタッチソフトはレイヤー編集機能を備えている一方 Raw現像機能はなく、反対にRaw現像ソフトはRaw現像機能はあるものの、レイヤー編集に対応していない場合が大半です。

 Raw現像とは、多くのデジタルカメラの撮像素子は完成したRGBデータを作成することができず、不ぞろいの不完全なRGBデータしか出力できません(但しシグマの一部のカメラを除く)。このような不完全なRGBデータしかないファイルをRawファイル (生のファイル) と称しています。但し、デジタルカメラからJpegファイルを出力する場合は、カメラ内のソフトウェアでRaw現像を行ってからJpeg出力しています。Raw現像ファイルは不完全なRawファイルを補完して完全なRGBデータの揃ったTIFFJpegファイルに変換することが主目的です。いわば不完全なデータから完全なデータを「でっち上げ」ているのです。

 中には、デジカメのJpegファイルを使えばよいのに、なぜわざわざRaw現像という面倒なことをやるのか、と疑問に思われる方もおられるでしょう。その理由は、カメラの撮像素子は12-14bitでデータを出力します。しかしJpegは8bitしかありません。しかも圧縮を掛けているので、かなりのデータが失われているのです。より高精度なデータ (例えば16bit TIFFPNG形式のファイル) が欲しければパソコンでRaw現像を行う必要があるのです。

 とはいえ、RawデータはJpegよりbit深度が深いとはいえ、不完全ですから、カメラが出力したデータをそのままコピーすれば高精度な完全な画像データが得られるわけではありません。いかにRaw現像ソフトがうまく「でっち上げ」てくれるかが、より高精度なデータを得られる鍵となります。例えば、16bitのTIFFファイルを得る場合にRaw現像ファイルが行うのは、デモザイクと言われる完全なRGBデータの作成作業、さらに、12-14bitのデータをいかに16bitに補完してbit深度を高めるかという、その2つの作業のアルゴリズムの違いが、ソフトウェアによる個性となります。さらに撮像素子で発生するノイズをどのように縮減するかもRaw現像ソフトの持ち味です。その結果Raw現像ソフトによって大きく得られる最終画像が異なります。

 一方、フォトレタッチソフトはRaw現像機能を持ちません。あったとしても簡易的なプラグインソフトで対応します。Photoshopは単独ですと Adobe camera rawという簡易的なRaw現像プラグインソフトも付属しています。しかし、主として現像はLightroomに任せ、残りのレイヤー編集が必要な高度なポストプロダクション編集をPhotoshopで行うという役割分担になっています。GIMPはRawTherapeeやdarktableあるいはDCRawといったフリーのRaw現像ソフトのプラグインに対応しています。

 本格的なフォトレタッチソフトが備えているレイヤー編集とは、基本的にはアニメーションを作成するときの下絵とセル画のような構造です。アニメーションは下絵の上に透明なシートの上に絵の部品を描いたセル画を重ねることで最終的な絵を完成させますが、同様に、オリジナルの画像の上に、セル画に相当する編集した部品を載せたレイヤー(層)をのせて、最終的な編集済みの画像を出力するイメージです。その具体例は当サイトの下記の説明をご覧ください。

yasuo-ssi.hatenablog.com そして、いわばセル画である編集レイヤーのどの部分を透明(補正効果のない部分)にしどの部分を編集用として不透明もしくは半透明(補正効果のある部分)にするかを決定するのが、各レイヤーにかかるレイヤーマスクになります。レイヤーマスクの画像は、通常、黒に塗った部分が、補正レイヤーを透明にし(補正効果がない部分=元絵に対しては不透過)、白に塗った部分が補正レイヤーの画像を見えるようにしたり編集効果を有効にする(つまり補正効果がある=元絵に対しては透過)部分です。これによりかなり複雑なローカル補正(画像の一部分の補正)が可能になります。このようなレイヤー編集はRaw現像ソフトでは基本的にサポートしておらず、グローバル(画像全体に渡る)補正 (一部色相や明度で補正効果の制御はできる機能もありますが) が基本になります。

 もちろん、フォトレタッチソフトとRaw現像ソフトの両者で編集機能が競合する場合も多いです。例えばフォトレタッチソフトのレベル補正とRaw現像ソフトの露出は、画像の明るさを変える同じような機能です。しかしRaw現像ソフトはカメラをいじっているなら直感的に分かる「露出」という言い方をし、実際にカメラの露出を変えたような形で編集するようエミュレーションをします。同様にフォトレタッチソフトの色相変換機能とRaw現像ソフトの色温度変換機能も同様なことができますが、色温度ケルビン値に基づいて色相を変えられるのはRaw現像ソフトです。同じ競合する機能があっても、Raw現像ソフトの方がカメラ寄りの操作体系を採用していることが多いと言えます。

 この連載記事ではRaw現像ソフト、フォトレタッチソフトを取り交ぜて紹介しています。

■不均等黄変ネガカラー補正技法総覧 (Bチャンネル補正法を除く)インデックス

グローバル補正編 (2021.6.9)

マニュアル色塗り補正編 (2021.6.10)

明度ゾーン別補正編 (2021.6.11)

画像情報や色域指定を活用したマスクを使ったローカル補正法 (2021.6.12)

そもそもレイヤー編集って何?  (2021.6.14)