42

作業中のアプリケーションに赤目軽減を実装する必要があります。

グーグルは主に商用エンドユーザー製品へのリンクを提供します。

GPL アプリケーションで使用できる優れた赤目軽減アルゴリズムを知っていますか?

4

10 に答える 10

44

ここでのパーティーにはかなり遅れましたが、将来の検索者のために、私が作成した個人用アプリに次のアルゴリズムを使用しました。

まず、縮小する領域がユーザーによって選択され、中心点と半径として赤目縮小メソッドに渡されます。このメソッドは、半径内の各ピクセルをループし、次の計算を行います。

//Value of red divided by average of blue and green:
Pixel pixel = image.getPixel(x,y);
float redIntensity = ((float)pixel.R / ((pixel.G + pixel.B) / 2));
if (redIntensity > 1.5f)  // 1.5 because it gives the best results
{
    // reduce red to the average of blue and green
    bm.SetPixel(i, j, Color.FromArgb((pixel.G + pixel.B) / 2, pixel.G, pixel.B));
}

色の濃さが維持され、目の光の反射が減らないため、この結果が本当に気に入っています。(これは、目が「生きている」外観を維持することを意味します。)

于 2009-04-05T09:34:31.130 に答える
7

目を見つけるのに最適なライブラリはopenCVです。画像処理機能が豊富です。IliaV.Safonovによる「自動赤目検出」というタイトルのこの論文も参照してください。

于 2008-09-26T00:24:04.067 に答える
6

まず、あなたは目を見つける必要があります!標準的な方法は、エッジ検出を実行してからハフ変換を実行して同じサイズの 2 つの円を見つけることですが、単純に赤いピクセルのクラスターを見つけるためのより簡単なアルゴリズムがあるかもしれません。

次に、画像に十分な緑/青のデータがあると仮定して、赤のチャネルを単に無視できると仮定して、それらを何に置き換えるかを決定する必要があります。

OpenCV は、画像処理用の非常に優れた無料ライブラリです。必要なものにはやり過ぎかもしれませんが、多くの例と非常に活発なコミュニティがあります。オブジェクト追跡アルゴリズムを検索することもできます。シーン内の色付きのオブジェクトを追跡することは、非常によく似た一般的な問題です。

于 2008-09-25T14:43:22.170 に答える
4

他の誰もより直接的な答えを思いつかない場合は、いつでもGIMP のソース コードをダウンロードして、その方法を確認できます。

于 2008-09-25T14:29:54.137 に答える
3

オープン ソース プロジェクトPaint.NETには、C# での実装があります。

于 2008-09-25T14:43:27.597 に答える
3

最も単純なアルゴリズムであり、依然として非常に効果的なアルゴリズムは、関心領域の RGB トリプルの R をゼロにすることです。

赤は消えますが、他の色は保持されます。

このアルゴリズムをさらに拡張すると、赤が支配的な色 (R > G および R > B) であるトリプルのみの R 値をゼロにすることが含まれる場合があります。

于 2008-09-25T14:29:41.763 に答える
3

imagemagick を試すことができます -- このページには、その方法に関するいくつかのヒントがあります。

http://www.cit.gu.edu.au/~anthony/info/graphics/imagemagick.hints

ページで赤目を検索する

于 2008-09-25T14:31:17.830 に答える
2

これは、Benry によって提供された回答のより完全な実装です。

  using SD = System.Drawing;

  public static SD.Image ReduceRedEye(SD.Image img, SD.Rectangle eyesRect)
  {
     if (   (eyesRect.Height > 0)
         && (eyesRect.Width > 0)) {
        SD.Bitmap bmpImage = new SD.Bitmap(img);
        for (int x=eyesRect.X;x<(eyesRect.X+eyesRect.Width);x++) {
           for (int y=eyesRect.Y;y<(eyesRect.Y+eyesRect.Height);y++) {
              //Value of red divided by average of blue and green:
              SD.Color pixel = bmpImage.GetPixel(x,y);
              float redIntensity = ((float)pixel.R / ((pixel.G + pixel.B) / 2));
              if (redIntensity > 2.2f)
              {
                 // reduce red to the average of blue and green
                 bmpImage.SetPixel(x, y, SD.Color.FromArgb((pixel.G + pixel.B) / 2, pixel.G, pixel.B));
                 pixel = bmpImage.GetPixel(x,y); // for debug
              }
           }
        }
        return (SD.Image)(bmpImage);
     }
     return null;
  }
于 2012-09-24T21:16:48.037 に答える