他の回答で述べたように、回折は不鮮明さをもたらしました。これをテストするために、F / 29に対応する点広がり関数を使用することにより、デコンボリューションを使用して画像の鮮明化を試みることができます。回折については、(全体的な正規化まで)
P(s)= {J 1 [ πrs /(λF)] / [ πrs /(λF)]} 2
ここで、J 1は第1種の次数1のベッセル関数、
sはピクセル単位で測定された画像の距離、
rは1ピクセルのサイズ(作物センサーの場合は通常約4.2 * 10 ^(-6)メートル)、
λは光の波長、
FはF値、この場合は29です。
これは、単色光の場合に当てはまり、適切な波長範囲で平均化できるカラーチャネルの点広がり関数を近似します。また、sで指定されたピクセルの領域にわたってP(s)を統合する必要があります。
このように3つのカラーチャネルの3点広がり関数をコンパイルすると、イメージを線形色空間に変換し、デコンボリューションアルゴリズムを適用してからsRGBに変換し直すことで、画像をシャープにすることができます。私は次の結果を得ました:
そのため、F値に関するデータとピクセルサイズに関する仮定のみを使用して、顔が大幅にシャープ化されています。バンディングアーティファクトは、画像の暗い部分に表示されます。これは、sRGBに変換した後のポスタリゼーションによるものです。
要求に応じて、使用するプログラムの詳細を追加します。私は使用のImageJとImageMagickのは、私も点広がり関数を計算するためにMathematicaを使用するが、それはまた、ImageJの中に行うことができます。既にポイントスプレッド関数を持っているときに、ImageJでデコンボリューションを行う方法を説明することから始めます。デコンボリューションを行うには、ImageJのプラグインをインストールする必要があります。この場合はこのプラグインを使用しましたが、DeconvolutionLabプラグインなどの他のプラグインも利用できます。
まず、線形色空間に変換する必要があります。ImageMagickを使用して、次のコマンドを使用して、不鮮明な画像(input.jpg)を線形色空間に変換します。
convert input.jpg -colorspace RGB output.tif
次に、ImageJを使用して、output.tifファイルを開きます。次に、メニューオプションから、「イメージ」、「カラー」、「スピットチャネル」の順に選択します。次に、メニューから[プラグイン]を選択し、次に[並列反復デコンボリューション]を選択してから、2d相互デコンボリューションを選択します。
次にデコンボリューションウィンドウが表示されます。次に画像を選択します。「PSF」は点広がり関数を意味し、そこで点広がり関数を含む画像ファイルを選択します。この方法では、Wienerフィルターに基づいた「WPL」を選択します。Wienerフィルターは、通常、低ノイズの画像に適度に機能します。WPLのオプションで「PSFの正規化」をチェックし、ローパスフィルターの値を0.2に変更します。デフォルトでは1ですが、低ノイズの画像の場合は低い値の方が適しています(大きく選択する場合は、鮮明度の低い画像を取得します)。他のオプション、境界は再帰的に選択でき、サイズ変更は「次の2のべき乗」に設定でき、出力は32ビットに設定でき、精度は2倍に設定できます。最大反復回数を15に選択しました
次に、「deconvolve」をクリックしてプログラムを実行します。次に、32ビットの画像ファイルを出力として取得します。通常、ピクセル値は元の画像にあったものと非常に似ていますが、元の画像形式の最大値を超えるピクセルをいくつか持つことができます。したがって、この場合、8ビットの画像から始めましたが、デコンボリューションされた画像では、255を超えるグレー値を設定すると、画像全体が暗くなりすぎる可能性があります。これは、これらのピクセルを255にクリップすることで修正する必要があります。これは、メニューで「プロセス」、「数学」、「最大」の順に選択して行うことができます。最大値は、その値を超えるグレー値をクリップするために使用されます。これは最後にクリックした画像に対して行われることに注意してください。「現在のファイル」であるファイルを確認するには、「
次に、3つのカラーコンポーネントをデコンボリューションしたら、メニューで[イメージ]、[カラー]、[チャネルのマージ]の順に選択して、それらを組み合わせることができます。次に、そこにある「RGBにスタック」コマンドを使用して8ビットRGBに変換できる合成画像を取得します。
その後、その画像を保存し、im.tifと呼びましょう。最後に、これをsRGBに変換する必要があります。ImageMagickで次のコマンドを使用してこれを行うことができます。
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
残りの問題は、ポイントスプレッド関数を取得する方法です。実際には、ここで議論しているような写真を撮影した場合、例えばF / 29の星などの点光源の写真を撮影し、それを点広がり関数として使用することができます。または、コントラストの高い境界を調べて、境界を越えてグレー値が1つの値から別の値に変化する方法から点広がり関数を抽出できます。しかし、その後、できる限り画像を鮮明にしようとしています。
この場合の目的は、F / 29での予想に基づいてカラーチャネルのポイントスプレッド関数をコンパイルし、それで画像をデコンボリューションし、結果が十分に改善されているかどうかを確認することでした。Mathematicaを使用して計算を行い、そのような高度なコンピューター代数プログラムでは、波長間隔での平均化やPSFをより現実的にするためのピクセル領域での統合など、あらゆる種類の操作を非常に簡単に実行できます。
ただし、ImageJでは、ポイントスプレッド関数として使用できる新しい画像を作成することもできます。[ファイル]をクリックしてから[新規]をクリックすると、サイズが32ビットの画像、たとえば黒で塗りつぶされた64 x 64を作成できます。その後、「プロセス」、「数学」、「マクロ」を選択して、グレー値の数式をプログラムできます。ここでベッセル関数を含むこの場合の点広がり関数を取得するには、級数展開の最初のいくつかの項でよく説明されているという事実を使用できます。私がリンクしたMathWorldページは、このシリーズ展開を提供します。したがって、J 1(x)2 / x 2 with x = πrs /(λF)は、A + B s 2 + C s 4の形式の関数に置き換えることができます。。sが大きすぎる場合、この近似は無効になります。これで、PSFがゼロになる傾向があることがわかりました。たとえば、約5または6ピクセルの距離では、ゼロに設定できます。これらの値で多項式がまだ小さいと仮定すると、マクロを次のように書くことができます。
if(d<7) v = A + B * pow(d,2) + B * pow(d,4)
次に、たとえば、ラムダ= 650 nm、500 nm、400 nm、または3つのカラーチャネルで回折を表すのに適切と思われるその他の値に対して3つの画像を作成します。その後、異なるラムダの画像を作成し、「プロセス」、「画像計算機」の順に選択して、「追加」を選択することにより、いくつかの異なる波長で平均化を行うことができます。次に、この結果に別の画像を追加できます。追加が完了したら、「プロセス」、「数学」、「分割」の順に選択して、平均を取得するために分割できます。