6

私は 24 時間年中無休で写真を撮影するデジタル カメラを持っていますが、天気によっては、画像が変な色かぶりになることがよくあります。一般的に青。

ここに画像の説明を入力

画像の色かぶりを減らすために c# から呼び出すことができるソース コードまたはライブラリを見つけようとしています。

Photoshop には、私がテストした画像で非常にうまく機能する機能があります。

  1. 画像を開く
  2. イメージを選択 -> 調整 -> マッチカラー
  3. [中和] チェックボックスをオンにします

これはうまく機能しますが、何をしているのかわかりません。

ここに画像の説明を入力

私は数学が苦手なので、使用できる既存のコードまたはライブラリに関するアイデアを探していました。

私はウェブを検索してきましたが、役立つものは何も見つかりませんでした - 助けていただければ幸いです。

4

5 に答える 5

4

アルゴリズムが入力データとして持つ情報が少ないため、ホワイト バランスの自動調整は常に適切に機能するとは限りません (実際の測光は行われず、マトリックスによって記録されたピクセル値のみであり、その一部はクリップされる可能性があります)。したがって、これはカメラの設定が途方もなく間違っている場合 (写真のように) に役立ちますが、WB を正しくすることはできません。まともなカメラを買った方がいい(安いカメラでもいい写真が撮れるものはある)

ところで、ホイールを発明したい場合、アイデアはカラーチャンネルをスケーリングして平均レベルを等しくすることです。ここで「平均」のさまざまな定義を試すことができます。また、クリップされた値を持つピクセルを測定から除外することもできます。しかし、@mickroの回答に記載されているこれを行う良い方法があるため、もう一度行うのは楽しいことではありません。

于 2013-09-16T06:58:28.153 に答える
2

これは、ホワイト バランスが屋内 (赤みがかった光を期待) に設定されているように見えますが、日光 (青) が得られます。GIMP には、写真のキャストを変更する色温度スライダーがあります。将来これを防ぐことについて話しているのですか、それとも既存の画像の束をバッチ処理することについて話しているのですか。シンプルなカメラ (携帯電話ではないかもしれません) でさえ、将来のショットのためにホワイト バランスを制御できます。

これは、コンピューターに接続された Web カメラのように見えますか? つまり、写真を撮るたびに WB が再評価され、各画像に同じ補正を適用できない場合があります。

これは、一連の画像の色温度をバッチ処理できる imagemagick スクリプトです空や海を撮影していて、それが青でなければならない場合はどうなるでしょうか。あなたはそれが正しい青であることを確認したいだけです.

編集: 特定の C# コードについては、こちらを確認してください。最初のカラー バランス イメージ セットの左下の例は、元のイメージに非常によく似ています。paint.netのソースコードにもホワイトバランス機能があります

于 2013-09-19T08:43:23.667 に答える
1

OpenCVを使用して、ニーズに合ったアルゴリズムを開発できます。問題の解決策を見つけるために調査を行ったところ、「カラー バランスの問題はさまざまな方法で解決できる」ことに気付きました。

Photoshop で得られる「完璧な」画像を完全に再現するのではなく、元の画像よりも優れたものを作成する、非常に単純なアルゴリズムをコーディングする方法を紹介します。その後、Google の openCV でこれらのトピックを検索し、別のアプローチを試すことができます。これをコーディングするために、ここで入手できる新しい OpenCV NuGet パッケージを使用しました。出力ディレクトリ (デバッグ フォルダ) に openCV のバイナリを追加するだけで、すぐに実行できます。

次に、コードは次のとおりです。

public Form1()
{
    InitializeComponent();

    NamedWindow windowsOriginal = new NamedWindow("Original");
    NamedWindow windowsModified = new NamedWindow("Modified");

    IplImage img = OpenCV.Net.CV.LoadImage(@"D:\hZpWG.jpg", LoadImageFlags.Color);
    IplImage imgDest = equalizeIntensity(img);


    windowsOriginal.ShowImage(img);
    windowsModified.ShowImage(imgDest);
}

IplImage equalizeIntensity(IplImage inputImage)
{
    if(inputImage.Channels >= 3)
    {
        IplImage ycrcb = new IplImage(inputImage.Size, inputImage.Depth, inputImage.Channels);

        OpenCV.Net.CV.CvtColor(inputImage, ycrcb, ColorConversion.Bgr2YCrCb);

        IplImage Y = new IplImage(ycrcb.Size, IplDepth.U8, 1);
        IplImage Cr = new IplImage(ycrcb.Size, IplDepth.U8, 1);
        IplImage Cb = new IplImage(ycrcb.Size, IplDepth.U8, 1);
        OpenCV.Net.CV.Split(ycrcb, Y, Cr, Cb, null);

        OpenCV.Net.CV.EqualizeHist(Y, Y);

        IplImage result = new IplImage(inputImage.Size, IplDepth.U8, inputImage.Channels);
        OpenCV.Net.CV.Merge(Y, Cr, Cb, null, ycrcb);

        OpenCV.Net.CV.CvtColor(ycrcb, result, ColorConversion.YCrCb2Bgr);

        return result;
    }

    return null;
}

フォームに入れましたが、コンソール アプリケーションでも使用できます。

これが結果です オリジナル ここに画像の説明を入力

それが役に立てば幸い!

于 2013-09-23T19:11:57.560 に答える