/** Returns reflected version of a matrix */
const math::matrix<float> Convolution::reflection(const math::matrix<float> A)
{
    int size = A.rowno();
    math::matrix<float> C(size, size);
    int col = A.colno();
    int row  = A.rowno();

    for (int x = 0; x < row; x++){
        for (int y = 0; y < col; y++){
            C((size - 1 - x), (size - 1 - y)) = A(x, y);
        }
    }
    return C;
}
/** Joins to matrices by multiplying the A[i,j] with B[i,j].
  * Warning! Both Matrices must be squares with the same size!
  */
const math::matrix<float> Convolution::join(math::matrix<float> A, math::matrix<float> B)
{
    int size = A.rowno();
    math::matrix<float> C(size, size);

    for(int x=0; x<size; x++){
            for(int y=0; y<size; y++) {
                C(x, y) = A(x, y) * B(x, y);
            }
        }
    return C;
}
/** Sums all of the matrixes elements */
const float Convolution::sum(const math::matrix<float> A)
{
    float sum = 0.0;
    int col = A.colno();
    int row  = A.rowno();
    for(int x=0; x<row; x++){
            for(int y=0; y<col; y++){
                sum += A(x,y);
            }
        }

    return sum;

}
const int MorphDilate::morph(math::matrix<float> window, math::matrix<bool> se)
{
    float min = PIXEL_VAL_MAX+1;
    int tempx,tempy;
    tempx = window.rowno();
    tempy = window.colno();
    for(int i=0;i<tempx;i++){
        for(int j=0;j<tempy;j++){
            if(se(i,j)==true){
                if(window(i,j)<min){
                    min = window(i,j);
                }
            }
        }
    }

    return (int) min;
}
const int MorphErode::morph(math::matrix<float> window, math::matrix<bool> se)
{
    float max=0.0;
    int row = se.rowno();
    int col = se.colno();

    for(int i=0; i<row; i++)
    {
        for(int j=0; j<col; j++)
        {
            if(se(i,j)==true && window(i,j)>max)
            {
                max = window(i,j);
            }
        }
    }

    return max;
}