2つの(類似した)画像のどちらがより鮮明かを検出する方法を探しています。
これは全体的な鮮明度の測定値を使用してスコアを生成していると思います(架空の例:image1の鮮明度スコアは9、image2の鮮明度スコアは7なので、image1の方がシャープです)
シャープネス検出/スコアリングアルゴリズムの検索をいくつか実行しましたが、画像のシャープネスを向上させるアルゴリズムに出くわしました。
誰かがこのようなことをしたか、または有用なリソース/リードを持っていますか?
私はこの機能をwebappのコンテキストで使用するので、PHPまたはC/C++が推奨されます。
簡単な方法は、コントラストを測定することです。ピクセル値の差が最も大きい画像が最も鮮明です。たとえば、ピクセル値の分散(または標準偏差)を計算でき、どちらか大きい方が優先されます。それは最大の全体的なコントラストを探しますが、それはあなたが望むものではないかもしれません-特に、それは最大の被写界深度を持つ写真を好む傾向があります。
目的に応じて、FFTなどを使用して、最も高い周波数のコンテンツを表示するものを確認することもできます。これにより、被写界深度が深い画像よりも、一部の部分で非常に鮮明な画像(他の部分ではそれほど鮮明ではない)を優先できるため、画像の多くは適度に鮮明になりますが、最大の鮮明度は低くなります(これは一般的です。より小さなアパーチャでの回折へ)。
例として このMatlab Centralページ に示すように、シャープネスは平均勾配の大きさで推定できます。
私はこれをPython asで使用しました
from PIL import Image
import numpy as np
im = Image.open(filename).convert('L') # to grayscale
array = np.asarray(im, dtype=np.int32)
gy, gx = np.gradient(array)
gnorm = np.sqrt(gx**2 + gy**2)
sharpness = np.average(gnorm)
同様の数値は、 numpy.gradient の代わりに単純な numpy.diff を使用して計算できます。結果の配列サイズは、そこで調整する必要があります。
dx = np.diff(array)[1:,:] # remove the first row
dy = np.diff(array, axis=0)[:,1:] # remove the first column
dnorm = np.sqrt(dx**2 + dy**2)
sharpness = np.average(dnorm)
この論文 は、DWTを使用してぼかし係数を計算する方法を説明しています。かなり単純に見えましたが、シャープネスを検出する代わりに、ぼやけを検出しています。最初にエッジを検出し(単純な畳み込み)、次にDWTを使用してそれを累積してスコアリングするようです。