シャープネス評価プラグインの自作 / Creating a Custom Sharpness Evaluation Plugin – Lightroom

注:現時点では自作に関する解説のみで、プラグイン自体の公開・提供は行っていません。作者が素人だからです。強い要望があれば考えます。

■きっかけ

「大量の同一シーンの写真の中から最もシャープな写真を選び出す」作業がよくある。鳥や動物、マクロ撮影などをする方は理解できると思う。生物であれば目にピントが合っているか(それ以外にも意図した範囲が被写界深度に含まれているか)が基本的な判断基準である。少なければ数枚だが、多いと数十枚から、等倍で比較しながらベストの写真を選び出すのは骨が折れる。個人的にはどれも一応シャープに撮れている時が一番面倒で、「目など特定部分のシャープネスを定量比較して順位付けしてくれる機能」がずっと欲しかった。ぱっと見で良ければあとは適当に選べばいいだろう?という人もいると思うが、不要な写真を削除したい自分としては、本当にこれがベストかが気になっちゃうんですね…。

しかし案外ニッチな要望なのか、Lightroomに実装される気配はなく、そのようなプラグインも知る限り見当たらないようだった。潮目が変わったのは、ChatGPTの登場。これでプラグイン自作できるんじゃね?と思い立ったのであった。

なお、作成と検証は2025年6月時点最新版のLightroom Classicを用い、Mac上で行っています。

■Lightroomプラグインの自作

自作したLightroomのプラグインは、lrpluginフォルダの直下に以下のファイルを含むことで構成されている。luaがLightroom上で実行されるスクリプトとなる。今回、Lightroom上で取得したデータをPythonに渡して処理する工程があるため、Pythonスクリプトも設置してある。なお、私が素人なので同じく素人向けに説明すると、luaやpyは所定のコードを記載したテキストファイルを作成し、拡張子をluaやpyで保存するだけである。lrpluginも、空のフォルダを作成して名前に.lrpluginを付けると自動で「パッケージ」という形式に変換される(Macの場合)。

SharpnessRank.lrplugin
—- info.lua
—- xxxxxx.lua
—- yyyyyy.py

これらのファイルを含むlrpluginフォルダをデスクトップでもデフォルトのプラグインフォルダでも適当な場所に置いて、Lightroomのプラグインマネージャーから追加することで使えるようになる。

■SharpnessRankプラグインの考え方

  1. 写真の選択
    比較したい複数の写真をLightroomのライブラリモジュール上で選択する。先頭の写真のみ仮想コピーを作成し2枚にしておく。先頭(本体でも仮想コピーでもよい)はシャープネスを比較したい領域として参照されるので、顔などに合わせて予めクロップツールで切り出す。2枚目は3枚目以降との位置合わせの基準になるため、切り出さない。3枚目以降も切り出す必要はない。
  2. プレビュー画像の生成
    選択された各写真から、Lightroom内部で生成される高解像度JPEGプレビューを取得。1:1プレビューを事前に作成しておく。元のRAWファイルには触れず評価を行う。
  3. 位置合わせ
    2枚目の画像を基準に、以降の画像を正規化相互相関(NCC)に基づくテンプレートマッチングで位置調整。構図のズレを補正し、同一領域の切り出しを可能にする。
  4. シャープネスの比較
    1枚目を参照してプレビュー画像の一部を自動的に切り出し、画像処理によってシャープネスを数値化。
    評価には ラプラシアン変換をベースとした空間周波数解析を用いる。具体的には、画像の局所的なエッジの強さ(勾配変化)を測定し、数値として定量化。エッジがはっきりしている画像ほど高いスコアとなり、逆にピンぼけやブレのある画像はスコアが低くなる。
  5. スコアの集計とランキング
    全画像のスコアを比較し、高い順にランキングを作成。各ファイル名とそのスコアを一覧形式で提示する。
  6. ビジュアルな比較用グリッドの生成
    切り出した画像パッチを横に並べたグリッド画像を自動生成。切り出しが成功していることを確認するための補助的な出力。
  7. 結果の通知と記録
    スコア順のランキング結果をポップアップダイアログで表示。あわせて、テキスト形式でもデスクトップの「SharpnessRank」フォルダに保存する。
  8. Lightroom上での自動評価付与
    ランキング上位5枚の写真に対して、自動的に星1~5のレーティングを設定。

本当はLightroom上で比較したい領域を選択して…というイメージをしていた。しかし、試行錯誤の結果それは現状ではできないようだったので、代替策として若干の手動準備が必要となっている。

1枚目と2枚目(仮想コピー)の画像を基準に、切り出しのサイズと位置が構図上での相対値として決定される。3枚目以降はそこに位置合わせで取得した手ブレなどによる「ずれ」も加味して切り出しを行うため、構図上で例えば大きな木に対して被写体が動いてなければ、完璧に同じ場所が切り出される。残念ながら、途中で被写体が大きく顔の向きを変えるなど動作してしまう場合は、大きめに領域を指定しておかないと比較ができない。その場合はピンポイントのシャープネス比較が難しくなるので精度は落ちる。

■検証結果

検証に使ったのはヨセミテで見つけたダグラスリス(Douglas Squirrel)。ドングリか何かを食べている。

合計29枚の画像を同時に比較した。最初の1枚目が切り出しの基準(これも判定される)で、2枚目が全体プレビュー取得のための仮想コピー。比較したい写真を選択してメニューのライブラリ→プラグインエクストラから実行。

下が、自動で切り出されたプレビューの確認用グリッド画像。構図全体に対して被写体が動かなければ正確な位置合わせができる。

大量の写真では多少待ち時間があるが、ポップアップでランキング結果が表示される。上位5枚の写真にはライブラリのレーティング機能を使ってシャープな順に★5〜★1を付与する。ランキングの括弧内がシャープネス評価のスコアで、絶対値には意味はなく、大きなほどシャープという判断になる。

今回の写真は比較的どれもシャープだったので目での比較が難しいが、ランキング最下位〜中位〜最上位を並べたのが下(ここでの★は自分で整理のために付けたもの)。
29位 スコア1200.02
21位 スコア1449.45
14位 スコア2031.92
1位 スコア2620.63

下位2枚は目視でもシャープネスがやや低いことがわかる。上位2枚は見分けが付きにくいが、スコアで出してくれれば決める労力が省ける。

■結論

ChatGPT o4-mini-highを使った本プラグインの大まかな作成時間は合計18時間程度と思われる。集中して2日間、加えて断続的に数日くらいでここまでは仕上げられた。

  • 10時間程度で基本的コンセプト検証、一応の安定動作版完成
  • 更に合計8時間程度で機能追加と動作安定化

狭く領域を指定できることで、シャープネス評価を目視での期待とほぼ一致させることができた。個人的には十分な実用レベルにできたと思っているので、これから写真の選別にかける時間を大幅短縮できることを期待したい。まだ試していないが、手持ちでのマクロ撮影でもかなり威力を発揮するはず。

さて、プラグインの提供はしていないと書いたにもかかわらず、ここまで読んでくださった方、ありがとうございます。興味を持った方はご自分で作ってみるのも良いでしょうし、強い要望があれば配布することも考えます。ただし当方はプログラム作成を本職とも趣味ともしていないため、どのようなやり方になるかは未定です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です