2016-04-07 16 views
0

Sadece görüntüyü BiCubic enterpolasyonu ile düzeltmeye çalışıyorum. RGB görüntüsünü enterpole etmek için kullanılan bazı kodlarım var. Gri Tonlamalı görüntü için çalışmak için kodu değiştirdim. Ama sonuçta sadece tamamen siyah görüntü aldım. Göz önünde bulundurulan giriş ve çıkış görüntü boyutu aynıdır. Kod aşağıya yapıştırılmıştır. Lütfen bana yardım et. Şimdiden teşekkürler.C++ Bicubic yöntemi ile görüntü enterpolasyonu

inline Uint16 saturate(float x, unsigned max_pixel) 
{ 
    return x > max_pixel ? max_pixel 
     : x < 0.0f ? 0 
     : Uint16(x); 
} 

inline float get_subpixel(const Uint16* in, std::size_t dest_width, std::size_t dest_height, unsigned x, unsigned y) 
{ 
    if (x < dest_width && y < dest_height) 
     return in[(y * dest_width) + x]; 

    return 0; 
} 


void interpolate(unsigned dest_width, unsigned dest_height, unsigned bits_allocated, const Uint16* src, Uint16** dest) 
{ 
    const double tx = 1; 
    const double ty = 1; 
    float C[5] = { 0 }; 
    unsigned max_bit = pow(2, bits_allocated); 

    for (unsigned i = 0; i < dest_height; ++i) 
    { 
     for (unsigned j = 0; j < dest_width; ++j) 
     { 
      const float x = float(tx * j); 
      const float y = float(ty * i); 
      const float dx = tx * j - x, dx2 = dx * dx, dx3 = dx2 * dx; 
      const float dy = ty * i - y, dy2 = dy * dy, dy3 = dy2 * dy; 


      for (int jj = 0; jj < 4; ++jj) 
      { 
       const int idx = y - 1 + jj; 
       float a0 = get_subpixel(src, dest_width, dest_height, x, idx); 
       float d0 = get_subpixel(src, dest_width, dest_height, x - 1, idx) - a0; 
       float d2 = get_subpixel(src, dest_width, dest_height, x + 1, idx) - a0; 
       float d3 = get_subpixel(src, dest_width, dest_height, x + 2, idx) - a0; 
       float a1 = -(1.0f/3.0f) * d0 + d2 - (1.0f/6.0f) * d3; 
       float a2 = 0.5f * d0 + 0.5f * d2; 
       float a3 = -(1.0f/6.0f) * d0 - 0.5f * d2 + (1.0f/6.0f) * d3; 
       C[jj] = a0 + a1 * dx + a2 * dx2 + a3 * dx3; 

       d0 = C[0] - C[1]; 
       d2 = C[2] - C[1]; 
       d3 = C[3] - C[1]; 
       a0 = C[1]; 
       a1 = -(1.0f/3.0f) * d0 + d2 - (1.0f/6.0f) * d3; 
       a2 = 0.5f * d0 + 0.5f * d2; 
       a3 = -(1.0f/6.0f) * d0 - 0.5f * d2 + (1.0f/6.0f) * d3; 
       (*dest)[i * dest_width + j] = saturate(a0 + a1 * dy + a2 * dy2 + a3 * dy3, max_bit); 
      } 
     } 
    } 
} 
+0

get_subpixel-calls sırasında herhangi bir sınırsız erişim durumu var mı? Bağlandığınız zaman 0 (siyah) olacaktır. Bir hata ayıklayıcısı size burada yardımcı olabilir. Sadece ilk fikrim. – KimKulling

+0

Cevabınız için teşekkür ederiz ... sınırlandırılmış erişimin bir kısmı var ama tüm aramalar için değil –

+0

Sonuç piksel değerlerini kontrol ettim. Bunlar çoğunlukla 100 değerinin altındadır. –

cevap

1

Buna nasıl sahip olabilirsiniz? C jj döngü sona erene kadar hesaplanmış sığınak var ds üzerinde olmalıdır - aksi takdirde yöntem doğru olduğunu düşünmüyorum.

for (int jj = 0; jj < 4; ++jj) 
     { 
      const int idx = y - 1 + jj; 
      float a0 = get_subpixel(src, dest_width, dest_height, x, idx); 
      float d0 = get_subpixel(src, dest_width, dest_height, x - 1, idx) - a0; 
      float d2 = get_subpixel(src, dest_width, dest_height, x + 1, idx) - a0; 
      float d3 = get_subpixel(src, dest_width, dest_height, x + 2, idx) - a0; 
      float a1 = -(1.0f/3.0f) * d0 + d2 - (1.0f/6.0f) * d3; 
      float a2 = 0.5f * d0 + 0.5f * d2; 
      float a3 = -(1.0f/6.0f) * d0 - 0.5f * d2 + (1.0f/6.0f) * d3; 
      C[jj] = a0 + a1 * dx + a2 * dx2 + a3 * dx3; 

     // } // end jj 

      d0 = C[0] - C[1]; 
      d2 = C[2] - C[1]; 
      d3 = C[3] - C[1]; 
      a0 = C[1]; 
      a1 = -(1.0f/3.0f) * d0 + d2 - (1.0f/6.0f) * d3; 
      a2 = 0.5f * d0 + 0.5f * d2; 
      a3 = -(1.0f/6.0f) * d0 - 0.5f * d2 + (1.0f/6.0f) * d3; 
      (*dest)[i * dest_height + j] = saturate(a0 + a1 * dy + a2 * dy2 + a3 * dy3, max_bit); 
     } // end jj move his above 
    } 
} 
+0

bana geçerli bir nokta verdin. teşekkür ederim. ama sorunuzu yanıtlarken, döngü sonu çizgisi etkilemez, çünkü C dizisi zaten 0 ile intialize edilir, dolayısıyla indeks problemi ortadan kalkar. Aynı indeks de (* dest), jj döngüsü sona erene kadar 4 kez atanacaktır. Bu yüzden ihtiyaç duyduğumuz son değer jj döngüsünün son yinelemesinde o dizine atanacaktır. ama mantıklı olarak yaptığım doğru değildi. ama teknik olarak onun çalışması :) –

+0

Bu hesaplamanın neden boşa harcanacağını bilmiyorum - aldığınız orijinal koda işaret edebilir misiniz? – gpasch