スキャンした 35 mm スライドを自動的に強調するためのルーチンを開発しています。コントラストを上げて色かぶりを取り除くための優れたアルゴリズムを探しています。何千もの画像を処理する必要があるため、アルゴリズムは完全に自動化する必要があります。これらは、スキャナーから直接抽出したサンプル画像の 2 つで、Web 用にトリミングしてサイズを縮小しただけです。
私は AForge.NET ライブラリを使用しており、フィルターHistogramEqualization
とContrastStretch
フィルターの両方を試しました。HistogramEqualization
局所的なコントラストを最大化するのには適していますが、全体的に満足のいく結果にはなりません。ContrastStretch
の方がはるかに優れていますが、各カラー バンドのヒストグラムが個別に引き伸ばされるため、色かぶりが強くなることがあります。
カラー シフトを減らすために、およびクラスUniformContrastStretch
を使用して自分でフィルターを作成しました。これにより、すべてのカラー バンドに同じ範囲が使用され、コントラストが低下しますが、色が維持されます。ImageStatistics
LevelsLinear
ImageStatistics stats = new ImageStatistics(image);
int min = Math.Min(Math.Min(stats.Red.Min, stats.Green.Min), stats.Blue.Min);
int max = Math.Max(Math.Max(stats.Red.Max, stats.Green.Max), stats.Blue.Max);
LevelsLinear levelsLinear = new LevelsLinear();
levelsLinear.Input = new IntRange(min, max);
Bitmap stretched = levelsLinear.Apply(image);
ただし、画像はまだかなり青いのでColorCorrection
、最初に画像の平均輝度を計算するフィルターを作成しました。次に、各カラー チャネルの平均値が平均輝度に等しくなるように、各カラー チャネルのガンマ補正値が計算されます。均一コントラスト ストレッチ イメージには平均値R=70 G=64 B=93
があり、平均輝度は(70 + 64 + 93) / 3 = 76
です。ガンマ値は に計算されR=1.09 G=1.18 B=0.80
、結果の非常にニュートラルな画像の平均値はR=76 G=76 B=76
期待どおりです。
さて、実際の問題に取り掛かります...画像の平均色をグレーに修正するのは少し極端すぎると思います.同じ画像の色を修正):
写真編集プログラムで手動で色補正を実行する 1 つの方法は、既知のニュートラル カラー (白/灰色/黒) の色をサンプリングし、画像の残りの部分をそれに合わせて調整することです。しかし、このルーチンは完全に自動化する必要があるため、それはオプションではありません。
ColorCorrection
フィルターに強度設定を追加して、強度 0.5 で平均値を平均輝度までの距離の半分に移動できると思います。しかし一方で、一部の画像は、色補正をまったく行わなくても最適に機能する場合があります。
より良いアルゴリズムのアイデアはありますか? または、2 番目のサンプルのように、画像に色かぶりがあるのか、それとも色がたくさんあるのかを検出する方法はありますか?