2016-04-07 11 views
0

Я просто пытаюсь сгладить изображение с помощью интерполяции BiCubic. У меня есть код, который используется для интерполяции изображения RGB. Я изменил код для работы с изображением Grayscale. Но в результате я получил только черное изображение. Считается, что размер входных и выходных изображений одинаковый. Код будет вставлен ниже. Пожалуйста, помогите мне. Заранее спасибо.C++ Image интерполяция с бикубическим методом

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? Он вернет 0 (черный), когда вы не связаны. Отладчик может помочь вам здесь. Только моя первая идея. – KimKulling

+0

Спасибо за ваш ответ ... есть некоторые из ограниченного доступа, но не для всех вызовов –

+0

Я проверил значения пикселей результата. они в основном ниже значения 100. –

ответ

1

Как у вас может быть это? В havent c был вычислен до тех пор, пока контур jj не завершится, скобка должна быть выше ds - я не думаю, что метод в противном случае.

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

вы дали мне действительную точку. Спасибо. но, отвечая на ваш вопрос, конечная скобка контура не будет влиять, потому что массив C уже инициализирован с 0, поэтому нет проблемы с индексом. Также тот же индекс в (* dest) будет назначен 4 раза, пока контур jj не закончится. поэтому последнее значение, которое нам нужно, будет присвоено в этом индексе последней итерацией цикла jj. но логически то, что я сделал, было неправильным. но технически это работает :) –

+0

Я не знаю, почему это вычисление должно быть потрачено впустую - можете ли вы указать на исходный код, который у вас есть? – gpasch