/*
 * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved.
 *
 * This file is part of BoofCV (http://boofcv.org).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package boofcv.alg.filter.misc;

import boofcv.struct.image.*;

/**
 * 

Implementation of {@link AverageDownSampleOps} specialized for square regions of width N.

* *

* DO NOT MODIFY: This class was automatically generated by {@link boofcv.alg.filter.misc.GenerateImplAverageDownSampleN}. *

* * @author Peter Abeles */ public class ImplAverageDownSampleN { public static void down(GrayU8 input , int sampleWidth , GrayI8 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; int N = sampleWidth*sampleWidth; int N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]& 0xFF; } } output.data[ indexOut++ ] = (byte)((total+N_half)/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]& 0xFF; } } output.data[ indexOut ] = (byte)((total+N_half)/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]& 0xFF; } } output.data[ indexOut++ ] = (byte)((total+N_half)/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]& 0xFF; } } output.data[ indexOut ] = (byte)((total+N_half)/N); } } public static void down(GrayS8 input , int sampleWidth , GrayI8 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; int N = sampleWidth*sampleWidth; int N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = total >= 0 ? (byte)((total+N_half)/N) : (byte)((total-N_half)/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = total >= 0 ? (byte)((total+N_half)/N) : (byte)((total-N_half)/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = total >= 0 ? (byte)((total+N_half)/N) : (byte)((total-N_half)/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = total >= 0 ? (byte)((total+N_half)/N) : (byte)((total-N_half)/N); } } public static void down(GrayU16 input , int sampleWidth , GrayI16 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; int N = sampleWidth*sampleWidth; int N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]& 0xFFFF; } } output.data[ indexOut++ ] = (short)((total+N_half)/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]& 0xFFFF; } } output.data[ indexOut ] = (short)((total+N_half)/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]& 0xFFFF; } } output.data[ indexOut++ ] = (short)((total+N_half)/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]& 0xFFFF; } } output.data[ indexOut ] = (short)((total+N_half)/N); } } public static void down(GrayS16 input , int sampleWidth , GrayI16 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; int N = sampleWidth*sampleWidth; int N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = total >= 0 ? (short)((total+N_half)/N) : (short)((total-N_half)/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = total >= 0 ? (short)((total+N_half)/N) : (short)((total-N_half)/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = total >= 0 ? (short)((total+N_half)/N) : (short)((total-N_half)/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = total >= 0 ? (short)((total+N_half)/N) : (short)((total-N_half)/N); } } public static void down(GrayS32 input , int sampleWidth , GrayS32 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; int N = sampleWidth*sampleWidth; int N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = total >= 0 ? ((total+N_half)/N) : ((total-N_half)/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); N_half = N/2; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; int total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = total >= 0 ? ((total+N_half)/N) : ((total-N_half)/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = total >= 0 ? ((total+N_half)/N) : ((total-N_half)/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); N_half = N/2; int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; int total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = total >= 0 ? ((total+N_half)/N) : ((total-N_half)/N); } } public static void down(GrayF32 input , int sampleWidth , GrayF32 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; float N = sampleWidth*sampleWidth; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; float total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = (total/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; float total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = (total/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; float total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = (total/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; float total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = (total/N); } } public static void down(GrayF64 input , int sampleWidth , GrayF64 output ) { int maxY = input.height - input.height%sampleWidth; int maxX = input.width - input.width%sampleWidth; double N = sampleWidth*sampleWidth; for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride; int endBoxY = y + sampleWidth; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; double total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = (total/N); } } // handle the right side if( maxX != input.width ) { N = sampleWidth*(input.width-maxX); for( int y = 0, outY = 0; y < maxY; y += sampleWidth, outY++ ) { int indexOut = output.startIndex + outY*output.stride + output.width-1; int endBoxY = y + sampleWidth; double total = 0; for( int yy = y; yy < endBoxY; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = (total/N); } } // handle the bottom if( maxY != input.height ) { N = (input.height-maxY)*sampleWidth; int indexOut = output.startIndex + (output.height-1)*output.stride; for( int x = 0; x < maxX; x += sampleWidth ) { int endBoxX = x + sampleWidth; double total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + x; for( int xx = x; xx < endBoxX; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut++ ] = (total/N); } } // handle the bottom right if( maxX != input.width && maxY != input.height ) { N = (input.height-maxY)*(input.width-maxX); int indexOut = output.startIndex + (output.height-1)*output.stride + output.width-1; double total = 0; for( int yy = maxY; yy < input.height; yy++ ) { int indexIn = input.startIndex + yy*input.stride + maxX; for( int xx = maxX; xx < input.width; xx++ ) { total += input.data[indexIn++]; } } output.data[ indexOut ] = (total/N); } } }

Ads help maintain this website.