@Override public Number get(int x, int y) { return image.get(x,y); }
public static void vertical(Kernel1D_S32 kernel, GrayS16 input, GrayI16 output ) { final int offset = kernel.getOffset(); final int width = input.getWidth(); final int height = input.getHeight(); for (int y = 0; y < height; y++) { for( int x = 0; x < width; x++ ) { int total = 0; int weight = 0; int startY = y - offset; int endY = startY + kernel.getWidth(); if( startY < 0 ) startY = 0; if( endY > height ) endY = height; for( int i = startY; i < endY; i++ ) { int v = kernel.get(i-y+offset); total += input.get(x,i)*v; weight += v; } output.set(x,y, (total+weight/2)/weight ); } } }
public static void horizontal(Kernel1D_S32 kernel, GrayS16 input, GrayI16 output ) { final int offset = kernel.getOffset(); final int width = input.getWidth(); final int height = input.getHeight(); for (int y = 0; y < height; y++) { for( int x = 0; x < width; x++ ) { int total = 0; int weight = 0; int startX = x - offset; int endX = startX+kernel.getWidth(); if( startX < 0 ) startX = 0; if( endX > width ) endX = width; for( int j = startX; j < endX; j++ ) { int v = kernel.get(j-x+offset); total += input.get(j,y)*v; weight += v; } output.set(x,y, (total+weight/2)/weight ); } } }
public static void convolve(Kernel2D_S32 kernel, GrayS16 input, GrayI16 output ) { final int offset = kernel.getOffset(); final int width = input.getWidth(); final int height = input.getHeight(); for (int y = 0; y < height; y++) { for( int x = 0; x < width; x++ ) { int startX = x - offset; int endX = startX + kernel.getWidth(); if( startX < 0 ) startX = 0; if( endX > width ) endX = width; int startY = y - offset; int endY = startY + kernel.getWidth(); if( startY < 0 ) startY = 0; if( endY > height ) endY = height; int total = 0; int weight = 0; for( int i = startY; i < endY; i++ ) { for( int j = startX; j < endX; j++ ) { int v = kernel.get(j-x+offset,i-y+offset); total += input.get(j,i)*v; weight += v; } } output.set(x,y, (total+weight/2)/weight ); } } }
@Override protected double computeOrientation() { computeAngles(); double windowRadius = windowSize/2.0; int w = rect.x1-rect.x0; double bestScore = -1; double bestAngle = 0; double stepAngle = Math.PI*2.0/numAngles; int N = w*(rect.y1-rect.y0); for( double angle = -Math.PI; angle < Math.PI; angle += stepAngle ) { double dx = 0; double dy = 0; for( int i = 0; i < N; i++ ) { double diff = UtilAngle.dist(angle,angles[i]); if( diff <= windowRadius) { int x = rect.x0 + i % w; int y = rect.y0 + i / w; dx += derivX.get(x,y); dy += derivY.get(x,y); } } double n = dx*dx + dy*dy; if( n > bestScore) { bestAngle = Math.atan2(dy,dx); bestScore = n; } } return bestAngle; }
public static void horizontal(Kernel1D_S32 kernel, GrayS16 input, GrayI16 output , int skip ) { final int radius = kernel.getRadius(); final int width = input.width - input.width % skip; final int height = input.height; for (int y = 0; y < height; y++) { for( int x = 0; x < width; x += skip ) { int total = 0; int div = 0; int startX = x - radius; int endX = x + radius; if( startX < 0 ) startX = 0; if( endX >= input.width ) endX = input.width-1; for( int j = startX; j <= endX; j++ ) { int v = kernel.get(j-x+radius); total += input.get(j,y)*v; div += v; } output.set(x/skip,y, (total+div/2)/div); } } }
public static void vertical(Kernel1D_S32 kernel, GrayS16 input, GrayI16 output , int skip ) { final int radius = kernel.getRadius(); final int width = input.width; final int height = input.height - input.height % skip; for (int y = 0; y < height; y += skip) { for( int x = 0; x < width; x++ ) { int total = 0; int div = 0; int startY = y - radius; int endY = y + radius; if( startY < 0 ) startY = 0; if( endY >= input.height ) endY = input.height-1; for( int i = startY; i <= endY; i++ ) { int v = kernel.get(i-y+radius); total += input.get(x,i)*v; div += v; } output.set(x,y/skip, (total+div/2)/div ); } } }
public static void convolve(Kernel2D_S32 kernel, GrayS16 input, GrayI16 output , int skip ) { final int radius = kernel.getRadius(); final int width = input.width - input.width % skip; final int height = input.height - input.height % skip; for (int y = 0; y < height; y += skip ) { for( int x = 0; x < width; x += skip ) { int startX = x - radius; int endX = x + radius; if( startX < 0 ) startX = 0; if( endX >= input.width ) endX = input.width-1; int startY = y - radius; int endY = y + radius; if( startY < 0 ) startY = 0; if( endY >= input.height ) endY = input.height-1; int total = 0; int div = 0; for( int i = startY; i <= endY; i++ ) { for( int j = startX; j <= endX; j++ ) { int v = kernel.get(j-x+radius,i-y+radius); total += input.get(j,i)*v; div += v; } } output.set(x/skip,y/skip, (total+div/2)/div ); } } }