豪鬼メモ

一瞬千撃

raw現像と自動補正のサービス genzo.cgi

各種のraw画像をアップロードすると、それを自動的に現像した上で輝度を補正して見栄えの良いJPEGファイルが出力されるサービスを作ってみた。まずはこちらのデモサイトにアクセスされたい。画像アップロード用のフォームが表示されるので、適当なraw画像のファイルを選んで「Develop」ボタンを押すと、現像結果が得られる。
f:id:fridaynight:20181119204153p:plain


対応するraw画像の形式は、DNG=Adobe、CR2=キヤノン、NEF=ニコン、ARW=ソニー、ORF=オリンパス、RW2=パナソニック、PEF=ペンタックス、RAF=富士フイルムである。出力はTIFF形式とJPEG形式のファイルが生成され、JPEGの出力は自動的に画面に表示される。JPEG出力には弱めのシャープネス処理をかけているので、そのまま鑑賞するのに向いている。TIFF出力は色深度16ビットでシャープネス処理をかけていないので、それをダウンロードして適当なレタッチツールで加工するのに向いている。

例によって、裏方ではOSSのソフトウェア群を組み合わせて呼んでいるだけである。Dcrawで現像し、ImageMagickで加工して、Exiftoolでメタデータを編集している。貧弱な私のサーバ(VPS)での運用なので、16Mピクセルの画像で1分くらい処理に時間がかかってしまうが、機能的にはそこそこ使えるツールになっていると思う。


もしこの機能が気に入ったら、自分の環境に設置していただきたい。設置は簡単で、このCGIスクリプトgenzo.cgiをWebサーバ上で実行できるようにしておき、同じディレクトリに tmp という作業用のディレクトリを用意すればOK。Python3とDcrawとImageMagickとExiftoolは別途入れておくことが必要である。また、Rec 2020のICCプロファイルデータをICCのサイトからダウンロードして、/usr/share/color/icc/Rec-2020.icc とかいう名前で設置すること。

以下、実装のメモ。Dcrawの基本的な使い方については以前の記事で述べたが、今回もほぼそれを踏襲している。目立つ違いは、-o 3 オプションをつけて、Adobe Wide Gamut色空間で現像していることだ。16ビットTIFFで出力する時点でsRGB等の狭い色域の色空間を使う理由は全くない。ここで注意すべきは、Dcrawで線形RGB座標系の画像を出力した場合、そこにつけられたプロファイルはRGBデータをJPEGが期待するsRGB座標系に変換した場合に適切に機能しないということだ。なので、現像した直後にRec 2020色空間に変換して、最終出力にもRec 2020プロファイルをつけている。Rec 2020のガンマ特性はsRGBと同じだが、色域はAdobe Wide Gamutと同等に広いので使いやすい。たとえ最終結果をsRGBに変換して鑑賞する場合にも、後処理の作業色空間にはRec 2020を使っている方が結果が良好になる。この画像は自動補正の出力結果だが、個人的にはかなり良い塩梅になっていると思う。
f:id:fridaynight:20181119223628j:plain

現像結果の暗めの画像を明るくする手法については、前回述べた対数補正をかけた上で、投機的にシグモイド補正をかける方法を採っている。現像結果から縮小画像を切り出した上で、その平均輝度が35%以上になるまで、補正を繰り返してかけていく。その回数を覚えてから、実際の現像結果に同じ処理を同じ回数だけ適用する。縮小画像は画面の上下左右10%ずつの領域を切り落としてから長辺1000ピクセルになるようにリサイズすることで作成している。

現像処理と補正処理にはそれなりの時間がかかるが、その間に何もデータを出力しないとHTTP接続がタイムアウトを起こしてしまう。それを防ぐべく、外部コマンドを実行している間にはログメッセージとともに、"." を0.5秒毎に出力している。ジョブキューによる非同期処理と結果通知をちゃんと実装するほどの価値のあるシステムではないので、場当たり的な方法で済ませている。

このCGIスクリプトは論理的には何プロセス同時に起動されようが動作するはずだが、私のサーバに負荷がかかりすぎるのは本意ではないので、デモサイトは同時に1ユーザしか利用できないようになっている。排他制御はlockfで行なっている。また、入力ファイルのサイズは100MBまで、画素数は50MPまでに制限している。42MPであるα7R IIの非圧縮rawが90MB弱ということなので、多くの場合はこれで問題ないだろう。HDRIを有効化したImageMagickは各チャンネルの値を4バイトのfloatで持つので、50MPの画像用の作業メモリは50*3*4で600MBにもなる。不特定多数が使うとなるとデータサイズを制限しておかないと恐ろしいことになる。そして、ダウンロード用のファイルは180秒後に削除される。正確には、毎回現像が行われる際に、最終更新時刻が180秒前より古い一時ファイルは削除している。


Web上でraw画像の現像ができるようになったので、Lightroomなどの現像ソフトを持っていない場合でも、raw画像の後処理と鑑賞ができる。raw撮りする人々が現像ソフトを持っていないなんてことはあまりないだろうけども、出先で急に現像しないといけなくなった場合とか、raw現像とレタッチの楽しさをお試しで味わってみたい場合とか、間違ってraw撮りしちゃったけど現像ソフトを入れるのはちょっと嫌だという場合に便利かもしれない。

SONY デジタルカメラ DSC-RX100 1.0型センサー F1.8レンズ搭載 ブラック Cyber-shot DSC-RX100

SONY デジタルカメラ DSC-RX100 1.0型センサー F1.8レンズ搭載 ブラック Cyber-shot DSC-RX100