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

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

ImageJのコマンドをPythonのコードに落とす (1)

 とりあえず自分にとってよく使いそうなコードに関するメモです。

ImageCalculator (画像計算機)

Process > ImageCalculator

Image Calculator

コード

 操作対象はImagePlusです。

from ij import ImagePlus, plugin

ic = plugin.ImageCalculator()
imp2 = ic.run("Subtract create", Imp0, imp1)

命令部分は、Operation の選択肢にある通りです。そして新たな画像(ImagePlus)を作る場合は、Operation名の後に、空白を挟んで create を追加します。

 

Math (画像計算)

Process > Math

Process > Math

Add...

コード

マクロを動かす形式 

from ij import IJ, ImagePlus

IJ.run(imp, "Add...","value= 20")

 操作を行う対象は、ImagePlusになります。引数は、最初に対象となるImagePlus、次にMathコマンドのうちの使いたいコマンド名を表示通りに文字列として与え、次にパラメータを与えます。パラメータに関してもすべて文字列として与える必要があります。

APIを使う形式

 基本的に画像のピクセルを書き換える操作はImagePlusではなく、 ImageProcessor に対して行う必要があります。アクティブなImageProcessorであれば、ImagePlus から imp.gerProcessor() で取得することができますが、そうでなければImagePlusからStackを取得し、そこからImageProcessor を取得しなければなりません。なお、Mathの各コマンドに直接対応するメソッドがない場合もあります。

 

from ij.process import ImageProcessor 
ip.add(20.0)

使えるメソッド ※( )内はパラメータとして与えるデータ形式

add​(double or int value)
subtract​(double value)
multiply​(double value)
and​(int value)
or​(int value)
min​(double value)
max​(double value)
gamma​(double value)
set​(double value)
log()
exp()
sqr()   < square
sqrt()  < square root
abs()

 これを見ると、マクロで簡単に指定できる割り算のメソッドがありません。もっともこれは逆数を掛ければよい、ということかと。それ以外にもメソッドとして指定できないものがありますので、IJ.run を使うメリットはあると思います。

 なお、上の、gamma メソッドを使う場合の注意点があります。通常ガンマ値というと、例えば「ガンマ2.2 を掛けて明るくする」という場合、実際には乗数として 1/2.2 を掛けていますが、その乗数の分母をガンマ値と称しています。しかし gamma メソッドでは、乗数自体を入力する必要があります。つまり、ガンマ2.2 で明るくしたい場合、

imp.getProcessor().gamma(1 / 2.2)

と指定する必要があります。

 

Invert (反転)

Edit > Invert

Invert

コード

マクロを動かす形式

from ij import IJ, ImagePlus
IJ.run(imp, "Invert...","")

 

APIを使う形式

from ij import IJ, ImagePlus
imp.getProcessor().invert()

 

from ij import ImagePlus, ImageProcessor
ip = imp.getProcessor()
ip.invert()

 

ART トラブルシューティング: ダークフレームを使うと画像がおかしくなる?

f:id:yasuo_ssi:20210904211415j:plain

 ARTのオンラインディスカッションに以下のような質問が上がっていました。

discuss.pixls.us 要は、ARTでダークフレームを適用したら画像がおかしくなった、という質問です。答えは、画像ファイルと、そこからノイズを消すためのダークフレーム画像のブラックポイントのレベルが異なっていたため、ということでした。つまり、ダークフレーム画像は、補正したい画像と同じISO, 同じ露出, そして出来れば同じ撮影コンディション (補正したい画像を撮影したらすぐ続けてダークフレーム画像を撮影する等) で撮影する必要がある、ということでした。

 因みにダークフレーム機能について紹介していませんでしたので、ついでにここでその機能も紹介します。 

ダークフレームメニュー (Rawタブ)

 長時間露出を行った写真には、輝点ノイズや、カメラの電子回路が発熱することで発生する熱カブリなどが現れることがあり、これらは、撮像素子の温度や露出条件が同じであれば、同箇所に同じように発生しがちです。そこで、これらのノイズを取り除くために、ノイズのみを撮影した画像を別途作成しておき、それを写真から差し引くことで、ノイズの補正を行う操作をダーク補正またはダーク減算といい、これに用いる、ノイズのみ記録した画像をダークフレームと言います。それに対し、補正対象となる画像を撮影した画像はライトフレームと称します。このダーク補正を行う機能がARTのダークフレームです。

 ダークフレームは、カメラのキャップをはめたまま光が一切入らないよう撮影すればよいので簡単です。但し、先も述べたように、撮像素子の温度や露出条件が同じであれば、同じところに同じように発生するので、補正したい画像を撮影した直後にダークフレームも撮影することが望ましいとされています。
 ARTのダークフレーム機能のマニュアルは、下記のRawPediaにあります。

https://rawpedia.rawtherapee.com/Dark_Frame/jp

 なお、下記のサイトを見ると

ryutao.main.jp ダークフレームも複数枚のダークフレームを撮影してコンポジットするのが望ましいと書かれています。ただ、ART および RawTherapee はそれも簡単で、複数の同一条件で撮影したダークフレーム画像を一つのフォルダにおいておき、そのフォルダを指定し、[自動選択] にチェックを入れておけば、自動的にコンポジットしてくれます。

 

チャンネルごとに簡単な画像統計を取得する ImageJ プラグイン

 ImageJで、R, G, B チャンネルごとの簡単な統計を取得するプラグインを作成してみました。まぁ、ImageJで画像のチャンネル分解を行って、チャンネルごとにヒストグラムを見ればよいのですが、面倒なので... また、IrfanViewヒストグラムですと、平均値は出してくれますが、標準偏差は出してくれません。

 このプラグインを起動して、画像を読み込ませると、下記のように、R, G, B毎に値を順々に幅、高さ、平均、標準偏差、最大値、最小値を表示してくれます。単純にImagePlusのgetStatisticsメソッドで取得できる値を表示するだけですが... 値は、16bit画像でも、8bit相当値(0-255)で表示します。なお、これで気づいたのですが、getStatisticsメソッドは、メディアン(中央値)を計算してくれないことが分かりました。プロパティに median はあるのですが、常に、0.0になってしまいます。

プラグインを実行させたところ

 よろしければどうぞ。ダウンロードはこちらから。

 

黄変ネガ写真 Bチャンネル再建法 (ハイブリッドアルゴリズム) 補正過程事例 (5) 【Ver. 4.6 対応】

f:id:yasuo_ssi:20210310145522j:plain

[青い部分に黄変が広がった写真の補正テクニック]

 2022.7.28アルゴリズム改定後のBチャンネル再建法補正ツールは、拡張疑似フラットフィールド補正アルゴリズムとGチャンネルミキシングアルゴリズムのハイブリッド補正となっています。一方の弱点をもう一方のアルゴリズムで補うことで、全体的な黄変補正効果を高めています。

 先日の記事にも書きましたが、拡張疑似フラットフィールド補正アルゴリズムが無力な代表例として、青い領域 (B値が、G, R値に比較して突出した領域) にかかった黄変の補正があります。その典型例が下記の画像です。

補正前 オリジナル

 この画像手持ちの黄変フィルムの中では最もダメージが大きいものの一つです。ほぼ全面に近い範囲が黄変を起こしているとともに、周辺部の褪色によるBチャンネルの情報抜けも結構激しいです。ネットですともっとダメージの大きい画像を公開されている方もいらっしゃいますが、手持ちの画像の中では、補正難易度が最も高い1枚です。フィルムは例によってフジカラーHR400です。これを今回 Ver. 4.6にバージョンアップしたBチャンネル再建法ツールを使って補正していきます。

 以前の記事でもお示ししたように、青いペイントの部分は、現状の拡張疑似フラットフィールド補正では補正できません (今、もうちょっとアルゴリズムの改善で何とかならないかと苦闘中です)。従ってこの部分の補正はGチャンネルミキシングアルゴリズムに依存することになります。しかし、Ver. 4.6 リリース記事でも述べたように、補正の主力となる近景補正レイヤーはこのような青い部分の明るさがGチャンネルのミキシングで本来の明るさより、暗くなる傾向にあり、さらにデフォルトで、B値が高い部分の補正を抑制するマスクが掛かっています。

 従ってこのような部分(もともと青い領域に黄変が広がった部分)は、Ver. 4.6 でガンマ値を高めて明るくした遠景補正レイヤーを転用して補正することになります。

 今回の事例紹介記事ではこの部分の補正手順について解説します。

 まず、ImageJ上でBチャンネル再建法プラグインを実行し素材ファイルを作成し、それをGIMPに読み込みます。この画像の場合すべてデフォルト値で実行しています。ただし、画像コンディションのみ「荒い」を指定しました。

 まず暗部補正レイヤーの編集です。レイヤーの最も明るい部分を透明化します。

暗部補正レイヤー

 次に周辺部補正レイヤーですが、試してみたところ、左下と右上で周辺と違和感なくつながる濃度が異なります。そこで、このレイヤーを複製し、左下補正レイヤーと右上補正レイヤーに分割します。

 まず右上補正レイヤーのマスクを下のように編集します。

周辺部補正マスク (右上) 不透明度 100%

 そしてレイヤー自体の不透明度は100%のまま使用します。

 一方、左下補正レイヤーのマスクは下記のように編集し...

周辺部補正マスク (左下)
不透明度 を落としている

レイヤー自体の不透明度を約80%まで落とします。

 次の遠景補正レイヤーのマスクですが、デフォルトでは下記のようになっています。

遠景マスク編集前

 この遠景マスクの編集ですが、基本アルゴリズム改定前 (7月以前) のオペレーションに戻します。つまり、基本近景をすべて塗潰すのを原則とします。但し、遠景補正レイヤーは、青い領域に黄変が広がっている部分の補正にも流用しますので、その部分が黒くなっている場合は、そこを白抜きに編集します。

 また、遠景補正レイヤーは必要に応じて適宜ガンマ補正を掛けて明るさを調整して使用してください。お勧めなのは、マスクを掛けた近景補正レイヤーの空の明るさに遠景補正レイヤーの空の明るさが合うようガンマ補正を掛けることです。なお、いくつかの画像を読み込ませて調べましたが適切なガンマ値は画像によってまちまちです。デフォルトで1.56というガンマを掛けていますが、この値は経験的に最低これぐらいは必要そう、ということで決めています。

続きを読む

Bチャンネル再建法ツール ハイブリッド・アルゴリズム実装版 Ver. 4.6《アルゴリズム一部変更 & UI改善》

f:id:yasuo_ssi:20210310145522j:plain

 ここのところ頻繁にバージョンアップを繰り返している、黄変ネガ写真補正用の Bチャンネルツールですが、やはりかなり大きなアルゴリズム変更を行ったこともあって、バグが取り切れていないのと、自分の中でまだコンセプトをまとめ切れていない部分があります。そのため、またまたバージョンアップをさせていただきます。

 今回の大きな機能面の改善は、実験的な新しいハイブリッドアルゴリズムの追加と、エキスパートモードメニューを中心とするユーザインターフェースの改善です。なお、今回アルゴリズムの改善まで踏み込んでいるので、Ver. 番号は、4.6 とします。

■画像状態オプションの追加

画像状態オプション

 今回、ノービスおよびエキスパートメニューの両方に画像状態オプション([Image condition])をつけました。画像状態は通常 ([Normal]) と荒れている([Coarse])のどちらかから選びます(デフォルトは通常)。

 「荒れている」を選ぶと、拡張疑似フラットフィールド補正アルゴリズムを実行するときのパラメータを変えますので、拡張疑似フラットフィールド補正アルゴリズムの効果が多少上がります。ただ、拡張疑似フラットフィールド補正アルゴリズムそれ自体、ぼやっとした変色を検出するためのアルゴリズムなので、エッジの明確な粗い粒状の黄変を完全に補正しきることはできない可能性はあります。

■ハイブリッドアルゴリズムの改訂版追加実装

 7月末に実装したハイブリッドアルゴリズムの仕組みは、従来のGチャンネルミキシング法アルゴリズムと拡張疑似フラットフィールド補正アルゴリズムをハイブリッド化したものでした。従って、黄変部分は拡張疑似フラットフィールド補正アルゴリズムによって削減されるだけではなく、Gチャンネルのミキシングによっても削減されていました。Ver. 4.54 でバグフィックスを行いましたが、そこで発見されたバグにより、一部の画像において拡張疑似フラットフィールド補正アルゴリズムがあまり働かないという現象が発生していました。それでもそれなりの補正ができていたのは、Gチャンネルのミキシングによる黄変の匡正効果が働いていたためです。

 ただ、GチャンネルをBチャンネルに混合することは、基本的に補正したBチャンネルをGチャンネルに近づけることになります。そこで、Type2マスク、つまり、Bチャンネル値がGチャンネルを上回る部分は、補正を弱めるマスクをつけて、出来る限りBチャンネルをGチャンネルに近づけないようにしていました。

 しかし、これには弱点もあり、Bチャンネルの褪色が進んでテクスチャ荒れがひどい場合は、補正を弱めた部分において、そのテクスチャ匡正効果も弱くなってしまいます。

 そこで、今回追加した実験的な新しいアルゴリズムでは、近景補正レイヤーにおいて、Gチャンネルの明度情報をなるべく拡張疑似フラットフィールド補正アルゴリズム適用後のBチャンナルに近づけてから、Bチャンネルにミックスするようにしました。つまり、Gチャンネルのテクスチャ情報のみ残して B チャンネルに混合することにより、Bチャンネルの値とGチャンネルの値の接近をなるべく起こさせないようにする、というものです。その代わり Type2 マスクの適用は行いません。これによって、テクスチャ匡正効果を全域において維持しようというものです。つまり黄変補正自体はほぼ拡張疑似フラットフィールド補正アルゴリズムに任されることになり、Gチャンネルの混合の機能は基本的にテクスチャの改善に限られることになります。

 但し、Gチャンネルの混入による色の補正効果を弱めることは必ずしも良いとは限りません。ですので、この新しいアルゴリズムモードは、実験的なオプションとして追加し、デフォルトは 7/28 に改善した従来のハイブリットアルゴリズムとしました

 なお、遠景補正レイヤーについては、既存のハイブリット補正と全く変わりません。単純に、拡張疑似フラットフィールド補正をかけたBチャンネルに対し、Gチャンネルを、ガンマ補正を掛けた上で混合しています。

 多分、Bチャンネルのテクスチャ荒れがさほどひどくない画像では、新アルゴリズムと従来のハイブリッドアルゴリズムの差はほとんどなく、むしろ従来アルゴリズムの方が好結果を収める可能性が高いものと思います。しかし、テクスチャ荒れが目立つ画像では、改善効果があると期待されます。

ノービスモードメニュー

 上図のように、[Apply hybrid correction?] というドロップダウン選択に、[New Method On] とい選択肢が加わっていますが、これを選ぶと、新アルゴリズムでファイルを作成します。ただの [On] ですと従来アルゴリズムです。

続きを読む

GIMPの開発版が2.99.12にアップデートされていた...

 GIMPの開発版が8/21に Ver. 2.99.12にアップデートされたようです。

www.gimp.org

 GIMPの開発版に関しては、今の開発状況が維持されるならば、個人的にはあまり期待できませんが、主な特徴として次のようなことが挙げられています。

・キャンバス上でブラシサイズが変えられるようになった。

・キャンバス上でできる操作が追加された

・キャンバスのズームの仕方が試験的に変更された

・環境設定でいくつかの項目の位置が変更された

・塗りつぶしの “fill by line artアルゴリズムの改良

 “fill by line artアルゴリズムとは、ちゃんと囲まれていない範囲を塗りつぶそうとすると、塗潰しが漏れたり、あるいは塗潰している線と塗りつぶしの色との間に隙間ができてしまうのを防ぐアルゴリズムです(詳しくはこちら参照)。既に2.10でも採用されています。これが改良されたということです。

・透明部分を表示する市松模様のカスタマイズが可能に

・指操作が可能なディスプレイにおける、スマホのような指を使った「ピンチング」操作が可能に

・ウェルカム・ダイアログの表示

CMYK関連機能の改善・充実

・表示テーマの追加・改善

・ファイルフォーマットサポートの改善・強化

・Script-Fuのインタープリターの独立化、APIの追加等

・WaylandおよびMac OSでのサポートの改善

・BablとGEGLのバージョンアップ

等々となっています。

ダウンロードは以下のページから

www.gimp.org

 

拡張疑似フラットフィールド補正の効果の違いがなぜ出るか?

f:id:yasuo_ssi:20210310145522j:plain

 先日、下記の記事を公開しました。

yasuo-ssi.hatenablog.com その中で、 拡張疑似フラットフィールド補正アルゴリズムの効果が出る画像と、あまり出ない画像の差があり、あまり出ない画像では、画像の粒子が荒いからではないか、と書きましたが、その後の探求で、全く異なることが分かりました。

 正解は、BとGチャンネルの相関の違い(≒ヒストグラムのパターン)の違いでした。

 まず 拡張疑似フラットフィールド補正アルゴリズムの効果が比較的高かった画像のヒストグラムを見てみます。

効果の高かった画像

 黄変量の大半が拡張疑似フラットフィールド補正アルゴリズムのみによって除去されています。一部元々黄緑色だった部分が過剰補正されたりもしていますが...

効果の高かった画像の
拡張疑似フラットフィールド補正アルゴリズム適用結果

 オリジナルの、R, G, Bのヒストグラムのパターンの違いを見てみると、Bだけシャドウ域のピークが大きくずれていますが、どのヒストグラムも大きなピークがシャドウ域とハイライト域の2カ所にあるというパターンは変わりません。BとG はずれはありますが基本的な位相は似ていると言えます。平均値は Bが約135と突出していて、GとRは117~119程度なので、この平均値を調整すると、Bのミドル域のピークがおおむねGとRのピークに一致し、うまく黄変が検出できた(つまりBのハイライト域のピークが、Gより下がっていることと、ミドル域のピークの左側のなだらかな部分が黄変要素と思われるので、Gのピークのパターンと比較することでその部分を検出することができた)、と考えられます。

 一方効果が低かった例です。

効果が低かった画像

 下に補正結果を示しましたが、拡張疑似フラットフィールド補正アルゴリズム単独では黄変量の2~3割も削減できたかどうかというあたりです。元々地が青い部分にかかっている黄変の削減はアルゴリズム上無理でしたが、ホームの不均質感ははっきり残っていますし、駅ビルの壁面などは多少薄くなったかどうか程度です。

効果が低かった画像の
拡張疑似フラットフィールド補正アルゴリズム適用結果

 オリジナル画像の R, G, Bのパターンを見ると、比較的 RとGは似ていますが、Bは大きく異なります。R, Gはミドルからシャドウ域に掛けて3つのピークがあります。ただ Rは真ん中のピークが低くはなっていますが。一方、Bは帽子状です。以下のヒストグラムを見ると、その差はもっと分かりやすいかと思います。以下の方は最高値と最低値で足切りをしたヒストグラムであるためです。

BとGのヒストグラムの違い

 うまく黄変量を検出できるように、GとBの明るさのレベルを平均値を揃えて検出させているのですが、効果の低い画像の方は、ヒストグラムのパターンが違いすぎる (厳密に言えばチャンネル間のピクセル分布の相関が低い) ので、平均値を揃えることだけでは十分に黄変量を推測することができなかったというのが、どうやらこの問いの正解でした(本当はエコロジカル・ファラシーの問題があるので、あまりヒストグラムを絶対視して語るべきではないのですが、目安にはなります)。

 因みに、Bチャンネルの標準偏差は44.3 Gチャンネルの標準偏差は44.8 そして相関係数は0.79でした。一方、効果のあった上のサンプルでは、Bチャンネルの標準偏差は59.1 Gチャンネルの標準偏差は71.7 そして相関係数は0.94 と圧倒的に相関係数が高いです。まさにこのBチャンネルとGチャンネルの相関の高さ低さの違いが効果の違いの原因です

 ただ、大きくヒストグラムのパターンが崩れている(=BチャンネルとGチャンネルの相関が低い)ということは同時に画像のダメージも大きいため、画像の荒れも大きいことが多く、それで私が疑似相関に足をすくわれてしまって、先日のようなことを書いてしまったというのが、事の真相でした。

 なお、GとBのレベルを調整する際に平均ではなく中央値も使ってみましたが、ほぼ変化なしでした。

 このあたりの対策も今後の課題としたいと思います。ただし、ダメージが中程度以下の画像では、ハイブリッドで使っているGチャンネルミキシングアルゴリズムが、拡張疑似フラットフィールド補正アルゴリズムが効果を発揮できない部分をカバーして補正してくれるので、実質的な問題は解決されています。もちろんより補正アルゴリズムの精密さ、厳密さを追求することもできますが、アルゴリズムをいくら改善しても、この程度のダメージレベルでは、見た目上は大きな変化はないでしょう。

 問題は、Gチャンネルミキシングアルゴリズムでもカバーしきれないような、ダメージ程度の重い画像をどうするか、というあたりです。一応現状では、エキスパートメニューで拡張疑似フラットフィールド補正アルゴリズム単独モードの場合、拡張疑似フラットフィールド補正アルゴリズムによる補正量をマニュアルで調整するオプションをつけていますが...