box filtering

(1) 2024-07-25 15:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
box filtering,希望能够帮助你!!!。

 转自:http://tech-algorithm.com/articles/boxfiltering/

Box filtering is basically an average-of-surrounding-pixel kind of image filtering. It is actually a convolution filter which is a commonly used mathematical operation for image filtering. A convolution filters provide a method of multiplying two arrays to produce a third one. In box filtering, image sample and the filter kernel are multiplied to get thefiltering result. The filter kernel is like a description of how the filtering is going to happen, it actually defines the type of filtering. The power of box filtering is one can write a general image filter that can do sharpen, emboss, edge-detect, smooth, motion-blur, etcetera. Provided approriate filter kernel is used.

Now that I probably had wet your appetite let us see further the coolness of box filtering and its filter kernel. A filter kernel defines filtering type, but what exactly is it? Think of it as a fixed size small box or window larger than a pixel. Imagine that it slides over the sample image through all positions. While doing so, it constantly calculates the average of what it sees through its window.
box filtering_https://bianchenghao6.com/blog__第1张

The minimum standard size of a filter kernel is 3x3, as shown in above diagram. Due to the rule that a filter kernel must fit within the boundary of sampling image, no filtering will be applied on all four sides of the image in question. With special treatment, it can be done, but what is more important than making the basic work first? Enough talk, lets get to the implementation asap!

[java]  view plain copy

  1. public int[] BoxFiltering(  
  2.         int[] pixels,int width, int height, float[] kernel) {  
  3.     int[] temp = new int[width*height] ;  
  4.     float denominator = 0.0f ;  
  5.     float red, green, blue ;  
  6.     int ired, igreen, iblue, indexOffset, rgb ;  
  7.     int[] indices = {  
  8.         -(width + 1),  -width,     -(width - 1),   
  9.         -1,                0,           +1,   
  10.         width - 1,      width,      width + 1  
  11.     } ;  
  12.     for (int i=0;i<kernel.length;i++)  
  13.         denominator += kernel[i] ;  
  14.     if (denominator==0.0f) denominator = 1.0f ;  
  15.     for (int i=1;i<height-1;i++) {  
  16.         for (int j=1;j<width-1;j++) {  
  17.             red = green = blue = 0.0f ;  
  18.             indexOffset = (i*width)+j ;  
  19.             for (int k=0;k<kernel.length;k++) {  
  20.                 rgb = pixels[indexOffset+indices[k]] ;  
  21.                 red += ((rgb & 0xff0000)>>16)*kernel[k] ;  
  22.                 green += ((rgb & 0xff00)>>8)*kernel[k] ;  
  23.                 blue += (rgb & 0xff)*kernel[k] ;  
  24.             }              
  25.             ired = (int)(red / denominator) ;  
  26.             igreen = (int)(green / denominator) ;  
  27.             iblue = (int)(blue / denominator) ;  
  28.             if (ired>0xff) ired = 0xff ;  
  29.                 else if (ired<0) ired = 0 ;  
  30.             if (igreen>0xff) igreen = 0xff ;  
  31.                 else if (igreen<0) igreen = 0 ;  
  32.             if (iblue>0xff) iblue = 0xff ;  
  33.                 else if (iblue<0) iblue = 0 ;              
  34.             temp[indexOffset] = 0xff000000 | ((ired<<16) & 0xff0000) |   
  35.                     ((igreen<<8) & 0xff00) | (iblue & 0xff) ;  
  36.         }  
  37.     }  
  38.     return temp ;  
  39. }  

Java code explanation 

The parameter pixels is an array containing a total of width*height pixel information. The parameter kernel is an array with a fixed length of nine. This is because the implementation assumes a window of size 3x3. The function also assume each pixel is in the form ARGB (alpha, red, green, blue), where blue is the least significant byte. Alpha is the transparency information and should just be left untouched. The array indices is a simple optimization table used to find neighboring pixels. The denominator is the sum of parameter kernel, it will be the denominator when calculating average. 

Check images below to see different kind of kernels gives varying results. Sample image is from MMORPG game Lineage II.
box filtering_https://bianchenghao6.com/blog__第2张

box filtering_https://bianchenghao6.com/blog__第3张

box filtering_https://bianchenghao6.com/blog__第4张

box filtering_https://bianchenghao6.com/blog__第5张box filtering_https://bianchenghao6.com/blog__第6张

box filtering_https://bianchenghao6.com/blog__第7张

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复