2012-08-09 16 views
6

Siyah beyaz bir resim pikselinin imzalı bir mesafe alanını hesaplamaya çalışıyorum ama bence kodumu bir yere yanlış girmeyi başardım. Bu benim giriş ve çıkış olduğu gibi:2B imzalı bir mesafe alanı hesaplanıyor

Girdi

Input

Çıktı

Output

yaşadığım sorun S ortasında siyah çizgi, benim Anlama bana tamamen açık gri olması gerektiğine inanmamı sağlıyor?

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

Bu bir siyah pikselden en kısa mesafeye sadece ilgilenen anlamına gelir:

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)); 
     } 
    } 

cevap

3

senin suçlu bu durum yönergesi:

Bu

kullanıyorum kodudur Beyaz bir piksel veya 'a' beyazsa, en yakın Siyah pikseli arıyorsunuz demektir.
if (p == white) 
{ 

O zaman muhtemelen ne beklediğiniz alacak:

sadece görmek için bu testi değiştirirseniz.

(Bunu test etmedim, umarım doğru olur).

(doğru değilse, bir matematik sınıfında kütüphane yöntemle inşa olmadığından Ayrıca, Math.Clamp yöntemi sonrası güzel olurdu.)

Son bir şey, değil algoritmanın bir pikseli kendisiyle karşılaştırmanızı istediğinden emin olun, böylece döngüler için iç içe geçmişinizin hesabını hesaba katmanız gerekebilir.

(temel olarak, çıktının, beyaz pikselin ortada olması nedeniyle ortadaki pikselin siyah olması ve siyah beyaz görüntünün görünmesiyle sonuçlanan siyah bir görüntü gibi görünmesini beklersiniz. beyaz.)