2012-01-02 3 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

[신호 처리] (http://dsp.stackexchange.com) 커뮤니티에이 정보를 입력하여 더 나은 답변을 얻을 수 있습니다. –

+0

정확한 문제를 조금 더 잘 이해할 수있는 이미지를 게시 할 수 있습니까? –

답변

2

(상위에 어두운 바 왼쪽 모서리 하단과 오른쪽입니다 꽤 잘 하나를 통지) 샘플링을 별도의 루틴에 넣으면 x 및 y 좌표로 픽셀 값을 반환하는 것이 가장 쉽습니다. 그런 다음 몇 가지 검사를하고 x와 y 값을 각각 0과 너비, 0과 높이 사이로 고정 할 수 있습니다. 그런 다음 너비 또는 높이보다 큰 음수 값이나 값을 안전하게 전달할 수 있습니다. 또한 반사, 색상 고정, 외삽 등과 같은 다른 기법을보다 쉽게 ​​시도 할 수 있습니다. 다른 동작을 수행하는 샘플링 기능을 간단히 교체 할 수 있습니다.

+0

또한 합계 영역 테이블을 조회 할 수도 있습니다. 더 빠르고 쉽게 구현할 수 있습니다. – user1118321