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

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

GIMP / Python 自作プラグイン (ファイルをレイヤーとして読込) 解説

 GIMPにおいて Python-fu を使ったプログラミングを行う場合、特にWindows環境ではデバッグが難しく結構大変です。下手をするとどこが間違っているのかさっぱり分からない場合もしばしばです。私自身もGIMP初歩プログラマですが、それでも私自身の経験も記しておくと、何かのお役に立てるかもしれません。そこで今回私が作成したGIMPで黄変写真補正用素材画像を読み込むプラグインに関する解説をなるべく丁寧に行い、Python-fu を使ったプログラミングを試みる方への参考に資そうと思います。

 なお、GIMPにおけるPythonプログラミングの基本的な参考サイトはこちらのリンクをご覧ください。また、プラグイン配布サイトにプログラミングを行った際に参考としたサイトを載せています。

 

GIMP / Python プラグイン作成の基本

  まず基本的なプラグインのひな型について解説します。青字が注釈です。緑字は適宜変更して記述する場所です。

基本的なひな形

#!/usr/bin/python Pythonインタープリターを起動
# -*- coding: codename -*- ←必要に応じてスクリプトで使う文字コードを宣言
            必要なければこの行自体不要
            メニューに日本語を表示したい場合 codenameutf-8にする
            同時にプラグインファイル全体をuft-8で保存しておく

from gimpfu import * PythonGIMPライブラリを呼び出す                   他のライブラリも呼び出す必要があれば適宜ここで宣言
def  plugin_name( 引数 ): プラグインの本体を以下定義

 

 ここにプラグインの具体的処理内容をインデントをつけて記述


register(   →以下GIMPプラグインとして登録する際の情報を記述
     "proc_name", プラグインコマンド名
     "blurb",  →プロシジャーブラウザに表示するプラグインの説明
     "help",  プラグインのhelpで表示する説明 blurbと同一で可
     "author", プラグイン著者名
     "copyright", プラグイン著作権者名 通常はauthorと同一
     "date", →著作年等
     "label", →メニューの中で表示されるプラグインのラベル
    例えば、"Resize to max..." 等
     "imagetypes", プラグインが処理対象とする画像のタイプ
 具体的には RGB, RGB*, GRAY*, INDEXEDなど
 指定しないなら "" で良い。また2つ以上指定するならカンマで区切り
 "RGB*,GRAY*" などと記述

     [parms],  プラグインに与えるパラメーター
   もしプラグイン起動時に入力ダイアログを表示する場合はここに記述※
   入力ダイアログがなければ のまま
    
,  プラグインの結果 通常は [] のままでよい
     plugin_name,
        Plugin_nameは、Pythonコードで呼び出す際のメソッドの名前
           def で、定義した名前を使用。
           def で plugin_main としたら
           ここでも、それと同じく plugin_main と書く。

    menu = "menuexpresson")
        →また、menuexpression は、プラグインGIMPのメニューの
         どこに表示するかを指示する。
         
main() プラグイン本体を呼び出し

続きを読む

GIMP Scripts.net

 GIMPプラグインスクリプトを集めた GIMP Scripts.netというblogサイトが昨年9月から運用されているようです。最近気が付きました。検索機能も10月に付け加わり、またGoogleの自動翻訳を通した表示もサポートされています。PSPIも掲載されています。

f:id:yasuo_ssi:20210122083137j:plain

 GIMP Registryがなくなってから、これらのプラグインを探すのが大変になっていましたが、今後はこの点も改善されそうです。

 サイトは以下です。

www.gimpscripts.net

ImageJ / Python Tips: ChannelSplitterの使用に注意!

 前回同様にプラグイン・サイレントバージョン作成過程で気づいたTipsです。

オリジナルのプラグインでは、次のマクロコマンドでウィンドウで開いたRGB画像を3チャンネルに分割していました。

IJ.run("Split Channels") →アクティブウィンドウの画像を3Ch.のウィンドウに分割
# R ch.
IJ.selectWindow("C1-", filename)  →Rチャンネルのウィンドウを選択
impR = IJ.getImage() →アクティブウィンドウの画像をimpRに代入
IJ.saveAsTiff(impR, folder + filename +"_R.tif") →Rチャンネル画像をTIFFとして保存
# G ch.
IJ.selectWindow("C2-", filename)  →Gチャンネルのウィンドウを選択
impG = IJ.getImage() →アクティブウィンドウの画像をimpGに代入
IJ.saveAsTiff(impG, folder + filename +"_G.tif") →Gチャンネル画像をTIFFとして保存
# B ch.
IJ.selectWindow("C3-", filename)  →Gチャンネルのウィンドウを選択
impB = IJ.getImage() →アクティブウィンドウの画像をimpBに代入
IJ.saveAsTiff(impB, folder + filename +"_B.tif") →Bャンネル画像をTIFFとして保存

続きを読む

GIMP / Python 開発用レファレンスマニュアルリンク

 GIMP開発用のレファレンスマニュアル等のリンクです。自分用にメモです。

 

developer.gimp.org 

GIMP API のレファレンスマニュアル

developer.gimp.org

GIMP Library リファレンスマニュアル (Ver. 2.8.7以降用)
 但し、Pythonから呼び出せないAPIも含まれる

developer.gimp.org

 

 これ以外に、GIMP本体のメニュー→[ヘルプ]→[プロシージャーブラウザ]からAPIが確認できます。ただし、ここで記述されているAPIPythonで使う場合、次のような注意が必要です*1

 ・ダッシュ("-")はアンダースコア("_")に変える。

 ・"-1"  と書かれているパラメータの値は、"None" に変える
  ※注意! 実際にプログラムに書くときは " " は外しただ None と書く

 ・run-modeと書かれているパラメータ項目は無視する

f:id:yasuo_ssi:20210116091556j:plain

プロシジャーブラウザ例
続きを読む

黄変フィルムBチャンネル再建補正法 GIMP用プラグインに手を入れました

f:id:yasuo_ssi:20210310145522j:plain


 今年の1/2に黄変フィルム Bチャンネル再建補正法用のImageJプラグインを、大きく変更しましたが、それに引き続き、1/17に、GIMPプラグインもバージョンアップしました。

 今までのプラグインは、素材ファイルを順番にレイヤーとして読み込むだけでしたが(いわば、Photoshopにおけるファイル→スクリプト→ファイルをレイヤーとして読み込む コマンドに相当するものがGIMPにないので、それを代替するようなもの)、今回の修正で、順番に読み込むだけではなく、マスクの必要があるレイヤーにマスクをつけるとともに、マスク素材画像をマスクとしてコピーして貼り付けるところまで一気にやるようになって、手間が省けています。

 あとは、マスク画像の編集だけ、マニュアルで行ってください。これだけは画像ごとに判断しなければならず、自動化できませんので... マスク編集を行う際は、マスクの表示もマニュアルでオンにしてください。

 また、日本語表示バージョンも作りました。英語バージョンか日本語バージョンのどちらかを使用してください。詳しくは同梱のReadme(Ja).txtをご覧ください。

 プラグインのダウンロードは1/2に公開したダウンロードページの同じリンクからダウンロードできます。

 

 なお、本連載記事で紹介した写真補正技法やソフトウェア (Plug-in) は、個人的もしくは非営利用途であれば、自由に使っていただいて構いませんが、本技法を使って何らかの成果 (編集した写真等) を公表する場合は、本記事で紹介した技法を使った旨クレジットをつけて公表していただくことをお願いします。

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

 

ImageJ / Python プログラミングの盲点: 画像二値化の際の出力値に注意!

 またまた、プログラムをいじっていてハマった点です。

ImageJのスクリプトで画像データをもとに白と黒の二値画像のマスクを作るプロセスがあります。具体的には次のような画像です。

 

f:id:yasuo_ssi:20200723215920j:plain

 

f:id:yasuo_ssi:20210101191259j:plain

二値化画像

 上の画像から下の二値化画像を得るために、当初記録したマクロを元にPython化したコードを書いて実現していましたが、コードが数行にわたってしまいました。

 それを getProcessor().threshold() を使うと1~2行で済みそうなので、それで次のようなコードを書いて書き換えました。

from ij import IJ, ImagePlus

imp.getProcessor().threshold(int(convValue(X, Mode)))
imp.updateAndDraw()

上のコードで impは対象となる画像 ImagePlus オブジェクトです。 convValue(X, Mode) というのは私が定義した関数で、Xの値を画像のモード (8bitか16bitか)に応じて適切な値に変換する関数です。具体的には8bitモードであれば、Xの値はそのまま、16bitモードならXの値に256を掛けるという動作をします。

getProcessor().threshold(  ) の(  )の中には、二値化する閾値を入れるのですが、画像が8bitなら0~255の値を代入し、16bitなら、それに256を掛けた値に変換して代入するというわけです。

 ところが... 8bit画像ならうまく二値化された画像が出力されるのですが、16bit画像だと、真っ暗な画像になってしまいます。しかも妙なことに、IrfanVIewで見た時だけは正しく二値化されたデータが表示されますが、GIMPPhotoshopでその画像を読み込むと真っ黒になってしまいます。

続きを読む

フィルム青色部分マスク作成ツールを改訂しました

f:id:yasuo_ssi:20210310145522j:plain


 昨年12月に、フィルム青色部分マスク作成ツールを公開しましたが、主として画像の青みのある部分において不均等黄変の補正がしにくいのをサポートするツールとして使うことを考え、仕様を変更しました。なお、周辺部補正用マスク素材画像作成機能は、Bチャンネル再建補正用素材画像作成ツールの方に組み込みましたので、そちらの方を使っていただいたほうが便利かと思います。主な変更は、反転画像の出力と、出力画像の閾値の変更です。このツールを走らせると次のオリジナル画像から、以下のような画像を出力します。

 

f:id:yasuo_ssi:20201109210402j:plain

図0. オリジナル (ツール適用対象)

f:id:yasuo_ssi:20210104132014j:plain

図1. 出力画像
続きを読む