原理
高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的为1,而高斯滤波器的模板系数,则随着距离模板中心的增大而系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器对图像个模糊程度较小,更能够保持图像的整体细节。
实现:
/**
* @description: 高斯滤波
* @param src 输入图像
* @param dst 输出图像
* @param size 掩膜大小
* @param sigmaX x方向方差
* @param sigmaY y方向方差
*/
void gaussianfilter(cv::Mat& src, cv::Mat& dst, cv::Size size, double sigmaX, double sigmaY)
{
cv::Mat kernel = cv::Mat::zeros(size, CV_64F);
int h = (size.height - 1) / 2, w = (size.width - 1) / 2;
double sum = 0.0;
for (int i = 0; i < size.height; ++i)
{
for (int j = 0; j < size.width; ++j)
{
kernel.at<double>(i, j) = exp(-(pow(i - h, 2) + pow(j - w, 2)) / (2 * sigmaX * sigmaY));
sum += kernel.at<double>(i, j);
}
}
for (int i = 0; i < size.height; ++i)
{
for (int j = 0; j < size.width; ++j)
{
kernel.at<double>(i, j) /= sum;
}
}
cv::filter2D(src, dst, src.depth(), kernel);
}