6

任意の画像を開いて と の 2 つの色を選択する簡単なプログラムを作成したいと考えていBackgroundColorますOutlineColor。次に、「オブジェクト」の周りにアウトラインを作成します。

これまでの私のコードは次のとおりです。

        for (int y = 1; y < height - 1; y++) //iterate trough every pixel 
        {                                    //in my bitmap
            for (int x = 1; x < width - 1; x++)
            {
                //i want to put a pixel only if the the curent pixel is background
                if (bitmap.GetPixel(x, y) != BackgroundColor)
                    continue;

                var right = bitmap.GetPixel(x + 1, y);
                var down = bitmap.GetPixel(x, y + 1);
                var up = bitmap.GetPixel(x, y - 1);
                var left = bitmap.GetPixel(x - 1, y);
                //get the nearby pixels
                var neibours = new List<Color> {up, down, left, right};

                var nonBackgroundPix = 0;
                //then count how many are not outline nor background color
                foreach (Color neibour in neibours)
                {
                    if (neibour != BackgroundColor && neibour != OutlineColor)
                    {
                        nonBackgroundPix++;
                    }
                }
                //finaly put an outline pixel only if there are 1,2 or 3 non bg pixels
                if (nonBackgroundPix > 0 && nonBackgroundPix < 4)
                {
                    bitmap.SetPixel(x, y, OutlineColor);
                }
            }
        }

そして、コードを実行して入力すると問題が発生し 前 ます 後

そして、私が欲しいのは 欲しい

私のコードに問題が見つかった場合は、これを行うためのより良いアルゴリズムを知っているか、何らかの方法でそれを行うことができます. よろしくお願いします!

4

1 に答える 1

4

問題:

背景色を非背景色に変更し、その後のピクセルチェックで取得します。

ソリューション:

「後で変更する」ピクセルを含む新しい配列を保存し、完全な画像がマッピングされたら、戻ってそれらを設定することをお勧めします。(また、すぐに変更して、チェックできるピクセルにフラグを追加することもできますが、これはブール配列に対するチェックなど、実装する必要のあるロジックです)

于 2012-08-10T20:40:50.197 に答える