www.pudn.com > xiaobo.zip.zip > haar2.c
#include#include #include #include void haar2_Transform2D(int **rows, int width, int height, int levels,bool inverse) { int *plane,*line,*nextline,*base; int step,step2,x,y,bx,by,ll_width,block; int a,b,c,d,A,B,C,D; if ( levels == 0 ) return; ll_width = width>>levels; block = 1< >2; B = a-b-c+d; C = a+b-c-d; D = a-b+c-d; line[x] = A; nextline[x] = C; line[x+step] = B; nextline[x+step] = D; } } } } } } else { for(bx=0;bx >2); \ b = A + ((3 - B + C - D)>>2); \ c = A + ((3 - B - C + D)>>2); \ d = A + ((3 + B - C - D)>>2); \ line[0] = a; nextline[0] = c; \ line[step] = b; nextline[step] = d; /** un_haar_quartet() **/ switch(levels) { case 0: break; case 1: line = base; nextline = base + width; un_haar_quartet(line,nextline,1); break; case 2: line = base; nextline = base + width+width; un_haar_quartet(line,nextline,2); line = base; nextline = base + width; un_haar_quartet(line,nextline,1); line += 2; nextline += 2; un_haar_quartet(line,nextline,1); line += width+width; nextline += width+width; un_haar_quartet(line,nextline,1); line -= 2; nextline -= 2; un_haar_quartet(line,nextline,1); break; case 3: step = 4; step2 = step+step; line = base; nextline = line + step*width; un_haar_quartet(line,nextline,step); step = 2; step2 = step+step; line = base; nextline = line + step*width; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += width*step2; nextline += width*step2; un_haar_quartet(line,nextline,step); line -= step2; nextline -= step2; un_haar_quartet(line,nextline,step); step = 1; step2 = step+step; line = base; nextline = line + width; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line = base+width*2; nextline = line + width; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line = base+width*4; nextline = line + width; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line = base+width*6; nextline = line + width; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); line += step2; nextline += step2; un_haar_quartet(line,nextline,step); break; default: /** go backwards in scale **/ for(step=(block>>1);step>=1;step>>=1) { step2 = step + step; for(y=0;y >2); b = A + ((3 - B + C - D)>>2); c = A + ((3 - B - C + D)>>2); d = A + ((3 + B - C - D)>>2); line[x] = a; nextline[x] = c; line[x+step] = b; nextline[x+step]= d; } } } break; } } } } }