2012-01-02 12 views
0

私はボックスのぼかしをプログラムしようとする初心者の愛好家であり、エッジに関して問題があります。誰かがエラーを見つけられることを願っています。Box Blur Edgesに問題がある

エッジが黒く、境界線が正しく反映されていないためです。これは固定サイズのカーネルで議論されていると確信していますが、私は可変サイズのカーネルを使用しています。

私は別のポストで見つけたコードを使用しています -

Optimized float Blur variations

は、しかし、私はちょうど反映ボーダー部分を理解していません。

最適化されているかどうか気にしていないし、他のカーネルシェイプを気にしていない場合でも、ボックスシェイプは問題ありません。

コードは、私はこの上の任意の助けに感謝

 {// code from https://stackoverflow.com/questions/7860575/optimized-float-blur-variations 

      //-------------------------------------- 
       int image_width ; 
       int image_height ; 
       int scale = 0; 

       int weight = (radius * 2) + 1; 

       int kernel_X = 0; 
       int kernel_Y = 0; 

       //-------------------------------------- 
       float sum = 0.0; 

       int kernel_width = radius;//set both to the same to make the kernel square 
       int kernel_height = radius;//set both to the same to make the kernel square 


       // HORIZONTAL 
       for(iy = 0; iy < image_height ;iy++) 
       { 
        sum = 0.0; 

        // Process entire window for first pixel (including wrap-around edge) 
        for (kernel_X = 0; kernel_X <= kernel_width; kernel_X++) 
        { 
         if (kernel_X >= 0 && kernel_X < image_width) 
          //sum += src[iy * image_width ]; 
          sum += src[iy * image_width + kernel_X]; 
        }  

    //>-------------- border code does not reflect edges HELP!! 
        // Wrap watch for left side of image & resulting black bar 
        for (kernel_X = (image_width - kernel_width); kernel_X < image_width; kernel_X++) 
        { 
         // if (kernel_X >= 0 && kernel_X < image_width)// HORIZONTAL    width = horizontal = X 
         // sum += src[iy * kernel_width + image_width ];//<-------------------enter tester formula here 
         // sum += src[iy + ix * image_width + kernel_X];//<-------------------FAIL 
         // sum += src[iy * kernel_width + image_width ];//<-------------------streaky 
        } 



        // Store first window 
        tmp[iy * image_width] = (sum/weight); 

        for(ix = 1; ix < image_width; ix++) 
        { 
         // Subtract pixel leaving window 
         if (ix - kernel_width - 1 >= 0) 
          sum -= src[iy * image_width + ix - kernel_width - 1]; 

         // Add pixel entering window 
         if (ix + kernel_width < image_width) 
          sum += src[iy * image_width + ix + kernel_width]; 
         else 
          sum += src[iy * image_width + ix + kernel_width - image_width]; 

         tmp[iy * image_width + ix] = (sum/weight);//just for testing 
        } 
       } 


       // VERTICAL 
       for(ix = 0; ix < image_width; ix++) 
       { 
        sum = 0.0; 

        // Process entire window for first pixel 
        for (kernel_Y = 0; kernel_Y <= kernel_height; kernel_Y++) 
        { 
         if (kernel_Y >= 0 && kernel_Y < image_height) 
          sum += tmp[kernel_Y * image_width + ix]; 
        } 
    //>-------------- border code does not reflect edges HELP!! 
        // Wrap watch for top side of image & resulting black bar 
        for (kernel_Y = image_height-kernel_height; kernel_Y < kernel_height; kernel_Y++) 
        { 
         //if (kernel_Y >= 0 && kernel_Y < image_height) 
         // sum += tmp[(iy + kernel_height - image_height) * image_width + ix]; 
        } 
        for(iy=1;iy< image_height ;iy++) 
        { 
         // Subtract pixel leaving window 
         if (iy-kernel_height-1 >= 0) 
          sum -= tmp[(iy - kernel_height-1) * image_width + ix]; 

         // Add pixel entering window 
         if (iy + kernel_height < image_height) 
          sum += tmp[(iy + kernel_height) * image_width + ix]; 
         else 
          sum += tmp[(iy + kernel_height - image_height) * image_width + ix]; 

         dst[ (scale * image_width * image_height) + (iy * image_width + ix) ] = (sum/weight); 

        } 
       } 
     } 

です。ここ ジョン

編集

おかげで、エッジの画像例のいくつかのリンクです。上記のコードを使用して、不適切なエッジを持つ

画像適切なボックスぼかしと http://img687.imageshack.us/img687/931/standardboxblur.jpg

画像(上端と左端に暗いバーに気づき、下と右のいずれかの非常に適切ではありません) http://img202.imageshack.us/img202/5137/boxblurbadedges.jpg

+0

これを[Signal Processing](http://dsp.stackexchange.com)コミュニティに追加して、より良い回答を得ることができます。 –

+0

正確な問題を少し良く理解するためにいくつかの画像を投稿できますか? –

答えて

2

それかもしれませんxとyの座標を指定するとピクセル値を返す別のルーチンにサンプルを入れると最も簡単です。次に、いくつかのチェックを行い、xとyの値をそれぞれ0と幅、0と高さの間に収めることができます。次に、幅または高さよりも大きな負の値または値を安全に渡すことができます。また、リフレクション、カラークランプ、外挿などの他のスキームをもっと簡単に試すことができます。クランプするサンプリング機能を他の動作を行うものと単に交換するだけです。

+0

また、合計面積テーブルを参照することもできます。より速く、実装するのがより簡単な場合もあります。 – user1118321