FrontPage › 닭집 › 프로그래밍심리학 › 11_The_Windows_Thread_Pool › 14_Exploring_Virtual_Memory › BoxFilter
Tech-Algorithm.com 에서 Box Filtering 에 대해 쓴 재미있는 블로깅이 있어서 간단 번역해 올립니다. 더 재미있는 것인 필자가 예제 이미지로 리니지2 를 썼다는 점.
box filtering 이나 convolution 에 대해 개념이 거의 없는 상태에서 쓴 글이라 이상한 부분이 있으면 얘기해주세요. 감사합니다.
public int[] BoxFiltering(
int[] pixels,int width, int height, float[] kernel) {
int[] temp = new int[width*height] ;
float denominator = 0.0f ;
float red, green, blue ;
int ired, igreen, iblue, indexOffset, rgb ;
int[] indices = {
-(width + 1), -width, -(width - 1),
-1, 0, +1,
width - 1, width, width + 1
} ;
for (int i=0;i<kernel.length;i++)
denominator += kernel[i] ;
if (denominator==0.0f) denominator = 1.0f ;
for (int i=1;i<height-1;i++) {
for (int j=1;j<width-1;j++) {
red = green = blue = 0.0f ;
indexOffset = (i*width)+j ;
for (int k=0;k<kernel.length;k++) {
rgb = pixels[indexOffset+indices[k]] ;
red += ((rgb & 0xff0000)>>16)*kernel[k] ;
green += ((rgb & 0xff00)>>8)*kernel[k] ;
blue += (rgb & 0xff)*kernel[k] ;
}
ired = (int)(red / denominator) ;
igreen = (int)(green / denominator) ;
iblue = (int)(blue / denominator) ;
if (ired>0xff) ired = 0xff ;
else if (ired<0) ired = 0 ;
if (igreen>0xff) igreen = 0xff ;
else if (igreen<0) igreen = 0 ;
if (iblue>0xff) iblue = 0xff ;
else if (iblue<0) iblue = 0 ;
temp[indexOffset] = 0xff000000 | ((ired<<16) & 0xff0000) |
((igreen<<8) & 0xff00) | (iblue & 0xff) ;
}
}
return temp ;
}











