func GaussianBlurGray(img *image.Gray, radius float64, sigma float64, border padding.Border) (*image.Gray, error) {
	if radius <= 0 {
		return nil, errors.New("radius must be bigger then 0")
	}
	return convolution.ConvolveGray(img, generateGaussianKernel(radius, sigma).Normalize(), image.Point{X: int(math.Ceil(radius)), Y: int(math.Ceil(radius))}, border)
}
GaussianBlurGray applies average blur to a grayscale image. The amount of bluring effect depends on the kernel radius
and sigma value. The anchor point specifies a point inside the kernel. The pixel value  will be updated after the
convolution was done for the given area. For border types see convolution package.
package blur
import (
	"errors"
	"github.com/Ernyoke/Imger/convolution"
	"github.com/Ernyoke/Imger/padding"
	"image"
	"math"
)
func BoxGray(img *image.Gray, kernelSize image.Point, anchor image.Point, border padding.Border) (*image.Gray, error) {
	kernel := generateBoxKernel(&kernelSize)
	result, error := convolution.ConvolveGray(img, kernel.Normalize(), anchor, border)
	if error != nil {
		return nil, error
	}
	return result, nil
}
func BoxRGBA(img *image.RGBA, kernelSize image.Point, anchor image.Point, border padding.Border) (*image.RGBA, error) {
	kernel := generateBoxKernel(&kernelSize)
	result, error := convolution.ConvolveRGBA(img, kernel.Normalize(), anchor, border)
	if error != nil {
		return nil, error
	}
	return result, nil
}