実用性があるのかないのかわからないけど、興味本位で写真の解像感を評価するソフトを開発してみた。もともと自分が使えればいいというスタンスだったのだが、いろいろ機能を追加していくうちに本格的になってしまい、一般公開することになった。
こういうソフトを作ろうと思ったきっかけは、カメラやレンズの解像感を数値的に表せないだろうかと考えたことにある。よく「このレンズはシャープでカリカリの描写をする」とか「線の細い写りをする」という風な言い方をするが、それは結局個人の主観が入っているので、客観的に見て正しいのかわからない。特に高いレンズほどいわゆる「プラシーボ効果」が強いので、本人がそう思い込んでいるだけという可能性もある(笑)。ブラインドテストをしたら区別が付かなかったり・・
またレビューサイトにおける評価と実写での評価が必ずしも一致しないことも動機の一つであった。DxOmarkやPhotozoneでのスコアが高い割に実写ではパッとしないレンズや、その逆も大いにある。そもそもこういう乖離が生じる原因は、レビューでは2次元のチャートを用いて評価していることにあるだろう。確かに解像度などを厳密に測定するためには規格に基づいたチャートを撮影する必要があるだろうが、現実の世界は3次元だから必ずしもそれが現実を反映していないこともまた確かである。
そこで実写画像を元にして解像感を評価できないかと考えた。ここで言う解像感とは、厳密な意味での解像度ではなく、人間の目で見たときに解像が良いと感じるか悪いと感じるかの指標である。専門的な用語で言えば、それは概ね空間周波数とコントラストに集約されるだろう。空間周波数が高く、コントラストが高いとき、人間の目は解像感があると認識するはずである。
ここまで言うと計測工学などに詳しい人はピンと来るのだろうが、要するに画像をスペクトルに分解してしまえばいいのである。そうすれば空間周波数ごとにコントラストの大小を比較することができる。よくオーディオでスペクトラムアナライザーが付いたものがあるが、あれと原理は全く同じだ。あれは音をスペクトルに分解して、周波数の低い音から高い音まで、どのくらいの割合で含まれているかをリアルタイムで表示している。
画像をスペクトルに分解するためにはフーリエ変換という手法を用いる。そんなのは別に難しいことじゃなくて当たり前の話。計算はすごくめんどくさいけど、ちゃんとしたライブラリがあるから自分で作る必要もない。ただ得られた結果をどうやって解析に生かすか、そこが一番難しいところ。
音と違って画像は2次元だから、本来なら2次元フーリエ変換をやるべきだろう。しかし今どきの巨大な画像データでそれをやると途方もなく時間がかかりそうな気がする。今の目的はスペクトルを求めることであって、何らかの処理を行った後に元に戻す必要はないから、そこまでやる必要はないだろう。画像といえども細かく見ればピクセルの集まりであり、横一列のラインが数千本重なったものに過ぎない。そこで画像でも1次元データとして扱い、それを画像全体について足し合わせれば全体のスペクトルが得られると考えた。
もっと具体的に言えば、まず画像を輝度情報に変換する。カラー写真は色があるから複雑だが、人間の目は色よりも輝度の変化に敏感であり、輝度によって解像感を認識していると言われている。要するにモノクロ画像に変換してから解析するということだ。そして水平方向に1ラインずつスキャンしてスペクトルを求め、それを垂直方向に積算して平均値を求める。同様にして今度は垂直方向に1ラインずつスキャンしてスペクトルを求め、それを水平方向に積算して平均値を求める。そのようにして得られた水平・垂直方向のスペクトルの平均値をさらに足し合わせて平均をとると、おおよそ画像全体のスペクトル分布を表していると考えられるだろう。これが基本的なアイディアだ。
原理の説明はこれまでにして、具体的なソフトの使用方法に移ろう。本ソフトはWindows 2000以降のPCで動作する。ただし猛烈にマシンパワーを喰うので、ある程度速いマシンでないと厳しいだろう。もちろんフリーソフトで下記からダウンロードできる。お約束の利用規約とかはめんどくさいので作っていない。そこは常識的に考えて自己責任で使ってほしい。
ダウンロード:Resolution_v102.zip
ZIPを展開すると実行ファイル(Resolution.exe)が出てくるが、インストールする必要はない。どこに置いても構わないので、ダブルクリックすれば即起動する。使い方は単純なのであえて説明するほどのこともないだろう。まず最初に「画像読込」をクリックして解析したい画像ファイルをロードする。画像ファイルはJPEG形式のみ対応している。また解析可能な最大サイズは8192×8192ピクセルまでとなっている。これは現在民生用で最も画素数の多いNikon D800に合わせたものだ。画像をロードしたら次に「解析実行」をクリックすると解析が開始される。基本はこれだけ。マシンパワーにもよるが、1600万画素クラスで約1分を要する。
ソフトを使用するのに知る必要はないのだが、あえて説明すると「リサンプル精度」というのは画素補間の精度を指定するものである。なぜ補間が必要なのかと言えば、コンピュータ上で行う高速フーリエ変換(FFT)はデータ数が2のべき乗個(2,4,8,16,・・・)でなければならないという制約があるからだ。本ソフトではNikon D800に合わせるため、元の画像サイズには関係なく、すべてのデータを縦横8192ピクセルに引き伸ばしてから解析を行っている。この補間は最も厳密な方法で行っているのだが、その代わり時間がかかる。2400万画素クラスになると2分以上かかるので、待ちきれない人もいるだろう。そういう場合はリサンプル精度を小さくすると時間を短くすることができる。値を大きくするほど精度は高くなるが、ものすごく時間がかかる。この値を変えても結果にはそれほど大きな影響はないようだが、もし時間が許せばなるべく大きい数値を指定した方が厳密な結果が得られる。
そして解析が終わると次のようなヒストグラムと解析結果が表示される。この見方について説明しよう。
画像解像度:2018 LW/PH
光学解像度:77.6 LP/mm
ナイキスト周波数に対する割合:66.73%
実効画素数:5.43 Mpixels
まずヒストグラムの横軸は空間周波数を表す。ここで言う空間周波数とは、画像の短辺あたりに白黒の線を何本分離できるかを示している。よく用いられるLW/PHと比べて1/2になっていることに注意。これは白黒のペアで考えるためだ。短辺方向のピクセル数の1/2がいわゆるナイキスト周波数となり、これ以上は理論的に解像することができない。もちろん長辺方向はさらに高い空間周波数まで解像できるが、短辺方向で評価するのが慣習になっているので、短辺方向のナイキスト周波数でヒストグラムを打ち切っている。
そして縦軸は空間周波数ごとのコントラストを示している。値のレンジが広いため、対数を取って表示してある。たとえば10^-3は0.001を表す。ただし画像全体の平均を取っているため、コントラストは薄められており、絶対的な数値にはさほど意味がない。ここではコントラストの大小を大まかに表していると理解しておけばよい。
次に枠内に表示される解像度の算出方法について説明しよう。一般的に空間周波数を上げていくほどコントラストは小さくなり、やがて人間の目に識別できなくなると解像不能になる。その限界が解像度と考えられる。ここではヒストグラムに表示されている赤い水平線がその限界値を表している。つまり、この限界値を下回るところの空間周波数が解像度というわけだ。「画像解像度」とは一般的に用いられるLW/PH(Line Width per Picture Height)という単位で表したもので、画像の短辺あたりに何本の線を引けるかを示している。この定義では白黒の線を2本と数えるため、赤い水平線とヒストグラムが交わるポイントの2倍になることに注意。
そして「光学解像度」とは、像面において1ミリメートルあたり何本の白黒線を解像できるかという物理的指標であり、MTFの測定でよく用いられるものである。これは「センサーの短辺サイズ」に数値を入力した場合のみ表示される。必要ならばカメラの仕様表から調べて入力すればよい。ただMTFでは通常コントラストが50%に低下するポイントで評価するのに対して、ここではギリギリ解像できるレベルで評価しているため、MTFでの測定結果よりかなり甘くなっていると考えた方がよい。MTFと同じ水準を望むなら、「コントラスト基準値」を上げてやればよい。
以上の数値は理論的な根拠があるわけではなく、多くの画像を解析した結果、他のレビュー結果と概ね合致するように「コントラスト基準値」を調整したものに過ぎない。したがって、解像度の絶対値そのものはほとんど意味を持たない。コントラストの基準値を変えるだけで結果がまったく変わってしまうからである。デフォルトのコントラスト基準値はあくまでも暫定値だから、気に入らなければ自分で変えることができるようになっている。
ここで重要なのはむしろ「ナイキスト周波数に対する割合」と「実効画素数」の方である。これは絶対評価ではなく相対評価だから、少なくとも自分の環境の中では普遍的な意味がある。「ナイキスト周波数に対する割合」とは、短辺方向の画素数の半分で決まるナイキスト周波数に対して、最大解像度が何%に相当するかを表している。これはベイヤー方式のセンサーでは決して100%にはならない。なぜなら概ね4画素を一組にした色分解が行われているためである。実際には画素数と同じだけ解像度を持っているわけではないのだ。もちろんレンズの性能にも大きく影響を受ける。そこそこ良いレンズであれば60%以上の数値が出るだろう。この場合、画素数に見合ったレンズの性能があると言える。もし50%を大きく下回るようだと、画素数を十分生かし切れていないことになる。レンズの解像度が画素数に追いついていないか、あるいはローパスフィルターが強すぎるという可能性もある。もちろんピンボケや微ブレといった撮影者側の責任である可能性もある。
そして「実効画素数」とは、上の考え方を元に、実際には何メガピクセル相当の解像度があるかを示すものである。たとえば6MPという数値が出れば、1200万画素のセンサーであっても実質的には600万画素程度の解像度しかないという意味だ。これは縦横それぞれの実効画素数の積になるから、2乗で効いてくることに注意。この指標はコントラスト基準値を一定にする限り、センサーの画素数も反映した相対評価が可能だから、手持ちのカメラやレンズの解像感を総合的に比較したい場合には最も有効な指標となる。これと同じ考え方はDxOmarkでもやっていると思う。
使い方はだいたいこんなところだが、結果を評価する際に注意しなければならないことがいくつかある。まず一番重要なのは素材の選び方だ。どんな写真でもよいというわけではない。それはもともと高周波成分の多い写真と少ない写真があるからだ。
たとえば、このように背景のボケた写真を解析すると次のような結果になる。
画像解像度:496 LW/PH
光学解像度:19.1 LP/mm
ナイキスト周波数に対する割合:16.40%
実効画素数:0.33 Mpixels
すると極端に低い解像度が出てしまった。これはもともと画像の空間周波数が平均的に低いためで、当たり前の結果だ。たとえ一部分がシャープであっても、平坦な部分の割合が大きいため、画像全体を平均するとコントラストが薄められて低い解像度しか出なくなる。画像の空間周波数を調べるのが目的であればよいが、解像度を評価する目的には適さない。
したがって次の写真のように、できるだけ画面全体に細かい樹木などの被写体が一様に分布している写真が望ましい。
この写真を解析した結果が、最初に示したデータだ。
その他、注意しなければならないのは天候だ。もともとコントラストの低い曇り日に撮ると、いくら細かい樹木などを撮影してもやはり低い解像度しか出ない。したがって、できるだけ天気の良い日に明暗のはっきりした被写体を撮るのが望ましい。
またJPEGは不可逆圧縮であるため、圧縮率を高くすると高周波成分が失われてしまう。保存する際はできるだけ圧縮率を低くすることが必要だ。さらにノイズが多い画像もダメ。ランダムなノイズは高周波成分とみなされてしまうため、極端に高い解像度が出てしまう。できるだけ最低感度で撮ることが望ましい。
あと言うまでもないことだが、複数のカメラやレンズの解像度を比較するためには条件を同じにしなければならない。つまり全く同じ構図とライティングで撮らなければならない。そうでなければ何を比較しているのか意味がなくなる。したがって手持ち撮影はダメで、基本的に三脚に固定して撮る必要がある。またレンズによって画角に微妙な誤差があるから、たとえ同じ焦点距離でも必ずしも同じ構図になるとは限らない。厳密を望むならばズームで調整するか、トリミングで揃えるしかないだろう。さらに細かいことを言うと、屋外の風景では風が吹いただけでも樹木の葉っぱが動いたりして高周波成分が変わる。雲が動いて明るさが変わる可能性もある。屋外でやるのはなかなか難しいのだ。
長くなったのでとりあえず以上だけれども、わからないことがあればコメントで受け付けているので気軽に尋ねていただきたい。
これでまた大量のネタを生産できるのではないかと期待している。(爆)