12

白黒画像ピクセルの符号付き距離フィールドを計算しようとしていますが、どこかでコードを間違えたと思います。これが私の入力と出力であるため:

入力

入力

出力

出力

私が抱えている問題は、Sの真ん中にある黒い線です.私の理解では、それは完全に薄い灰色であるべきだと思いますか?

これは私が使用しているコードです:

    for (int x = 0; x < source.width; ++x)
    {
        for(int y = 0; y < source.height; ++y) 
        {
            // Get pixel
            float a = source.GetPixel(x, y).r;

            // Distance to closest pixel which is the inverse of a
            // start on float.MaxValue so we can be sure we found something
            float distance = float.MaxValue;

            // Search coordinates, x min/max and y min/max
            int fxMin = Math.Max(x - searchDistance, 0);
            int fxMax = Math.Min(x + searchDistance, source.width);
            int fyMin = Math.Max(y - searchDistance, 0);
            int fyMax = Math.Min(y + searchDistance, source.height);

            for (int fx = fxMin; fx < fxMax; ++fx)
            {
                for (int fy = fyMin; fy < fyMax; ++fy)
                {
                    // Get pixel to compare to
                    float p = source.GetPixel(fx, fy).r;

                    // If not equal a
                    if (a != p)
                    {
                        // Calculate distance
                        float xd = x - fx;
                        float yd = y - fy;
                        float d = Math.Sqrt((xd * xd) + (yd * yd));

                        // Compare absolute distance values, and if smaller replace distnace with the new oe
                        if (Math.Abs(d) < Math.Abs(distance))
                        {
                            distance = d;
                        }
                    }
                }
            }

            // If we found a new distance, otherwise we'll just use A 

            if (distance != float.MaxValue)
            {

                // Clamp distance to -/+ 
                distance = Math.Clamp(distance, -searchDistance, +searchDistance);

                // Convert from -search,+search to 0,+search*2 and then convert to 0.0, 1.0 and invert
                a = 1f - Math.Clamp((distance + searchDistance) / (searchDistance + searchDistance), 0, 1);
            }

            // Write pixel out
            target.SetPixel(x, y, new Color(a, a, a, 1));
        }
    }
4

1 に答える 1

3

あなたの犯人はこの条件文です:

// If not equal a
if (a != p)
{

これは、黒のピクセルから白のピクセルまでの最短距離のみに関心があることを意味します。つまり、「a」が白の場合は、最も近い黒のピクセルを探しています。

そのテストを単に表示するように変更すると、次のようになります。

if ( p == white )
{

そうすれば、おそらくあなたが期待するものを手に入れるでしょう。

(私はこれをテストしていないので、正しいことを願っています)。

(また、正しくない場合は、Math クラスの組み込みライブラリ メソッドではないため、Math.Clamp メソッドを投稿するとよいでしょう。)

最後に、アルゴリズムがピクセルをそれ自体と比較することを望んでいるかどうかわからないため、ネストされた for ループ内でそれを考慮する必要がある場合があります。

(基本的に、中央に白いピクセルが 1 つある完全に黒い画像の出力はどのように見えると予想しますか?近くに白いピクセルがないため、中央のピクセルの出力は黒である必要がありますか、それとも白である必要があります。)

于 2012-08-09T21:30:31.330 に答える