00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <iostream>
00025 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
00026 #pragma warning(disable:4996)
00027 #endif
00028
00029
00030
00031 #include "ConvolutionKernel.hpp"
00032
00033
00034
00035
00036 namespace kn{
00037
00038
00039
00040 ConvolutionKernel::ConvolutionKernel(){
00041 _width = 3;
00042 _height = 3;
00043 _xOrigin = 1;
00044 _yOrigin = 1;
00045 _values = new double[9];
00046 std::fill(_values,_values+_width*_height, 1.0);
00047 }
00048
00049 ConvolutionKernel::ConvolutionKernel(unsigned int width, unsigned int height,
00050 unsigned int xOrigin, unsigned int yOrigin,
00051 double* values) {
00052 _width = width;
00053 _height = height;
00054 _xOrigin = xOrigin;
00055 _yOrigin = yOrigin;
00056 if(values != NULL){
00057 _values = new double[_width*_height];
00058 std::copy(values,values+_width*_height,_values);
00059 }
00060 else{
00061 unsigned int size = width * height;
00062 _values = new double[size];
00063 std::fill(_values,_values+size, 1.0);
00064
00065 }
00066 }
00067
00068 ConvolutionKernel::ConvolutionKernel(const ConvolutionKernel & e){
00069 _width = e.width();
00070 _height = e.height();
00071 _xOrigin = e.xOrigin();
00072 _yOrigin = e.yOrigin();
00073 _values = new double[_width*_height];
00074 std::copy(e.values(),e.values()+_width*_height,_values);
00075
00076 }
00077
00078
00079 ConvolutionKernel::~ConvolutionKernel(){
00080 delete[] _values;
00081 }
00082
00083 double ConvolutionKernel::operator()(int x, int y) const {
00084 if( (x < xLowerBound()) || (x >= xUpperBound()) ||
00085 (y < yLowerBound()) || (y >= yUpperBound()) )
00086 throw ImageException("coordinates out of bounds");
00087 return _values[x+_xOrigin+(y+_yOrigin)*_width];
00088 }
00089
00090
00091 ConvolutionKernel& ConvolutionKernel::operator=(const ConvolutionKernel& k) {
00092 if(&k == this) return *this;
00093 if(_width*_height != k.width()*k.height()){
00094 delete[] _values;
00095 _values = new double[k.width()*k.height()];
00096 }
00097 _width = k.width();
00098 _height = k.height();
00099 _xOrigin = k.xOrigin();
00100 _yOrigin = k.yOrigin();
00101 std::copy(k.values(),k.values()+_width*_height,_values);
00102 return *this;
00103 }
00104
00105
00106
00107
00108 }