图像处理中,高斯滤波主要可以使用两种方法实现。一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化。离散化窗口划船卷积时主要利用的是高斯核,高斯核的大小为奇数,因为高斯卷积会在其覆盖区域的中心输出结果。常用的高斯模板有如下几种形式:
高斯模板是通过高斯函数计算出来的,公式如下:
从以上描述中我们可以看出,高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度,如果σ较小,那么生成的模板中心系数越大,而周围的系数越小,这样对图像的平滑效果就不是很明显;相反,σ较大时,则生成的模板的各个系数相差就不是很大,比较类似于均值模板,对图像的平滑效果就比较明显。
void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT)
参数详解如下:
src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数。或者,它们可以是零的,它们都是由sigma计算而来。若(blur1,blur2)为高斯核的大小,blur1和blur2的值可以不同。参数0表示标准差取0。当blur1=blur2=1时,相当于不对原始图像做操作。**blur1和blur2越大,图像的模糊程度越大。**但不是blur1和blur2越大越好,blur1和blur2太大,不仅会滤除噪音,还会平滑掉图像中有用的信息。所以blur的选取要进行测试。如果要进行滤波的图像的长宽比大致为1:1,那么选取blur时,一般设置blur1=blur2。如果要进行滤波的图像的长宽比大致为m:n,那么选取blur时,blur1:blur2=m:n
sigmaX,表示高斯核函数在X方向的的标准偏差。
sigmaY,表示高斯核函数在Y方向的的标准偏差。
sigma和窗口大小size是互相推算出来的。如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。如果设置size,那么sigma不起作用;如果设置size(0,0),那么通过sigma就能调节模糊效果。只设置sigmaX,不设置sigmaY那么默认sigmaY=sigmaX。
利用TrackBar调节delta参数
#include
#include "opencv2\opencv.hpp"
using namespace std;
using namespace cv;
int delta1;
int delta2;
Mat src;
Mat dst;
Mat gray;
Mat gauss_mat;
Mat binary;
Mat canny;
void gauss(int b, void* userdata) {
cvtColor(src, gray, COLOR_BGR2GRAY); //转化成灰度图
GaussianBlur(gray, gauss_mat, Size(1, 1), delta1, delta2); //平滑滤波
//threshold(gauss_mat, binary, 10, 255, THRESH_BINARY | THRESH_OTSU); //自适应二值化
//Canny(binary, canny, 20, 80, 3);
imshow("gauss", gauss_mat);
}
int main() {
src = imread("coin.jpg");
namedWindow("gauss", WINDOW_NORMAL);
//调节GaussianBlur的delta
createTrackbar("gaussbar", "gauss", &delta1, 50, gauss, 0);//调节delta时不能为0,否则报异常。如果Size不为(0,0),调节delta没有任何作用。
createTrackbar("gaussbar", "gauss", &delta2, 50, gauss, 0);
waitKey(0);
}
//高斯模糊,中心占得比重最大
void QuickDemo::gaussian_blur_demo(Mat &image) {
Mat dst;
GaussianBlur(image, dst, Size(0, 0), 100);//卷积核大小必须是奇数,sigma和窗口大小是互相推算出来的。如果设置size,那么sigma不起作用;如果设置size(0,0),那么通过sigma就能调节模糊效果。
imshow("高斯模糊", dst);
}
#include
#include "opencv2/opencv.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
cv::Mat input;
input = cv::imread("test1.png");
cv::Mat org = input.clone();
cv::namedWindow("input", WINDOW_NORMAL);
cv::imshow("input", input);
//GaussianBlur
for (size_t i = 0; i < blur_times; ++i)
cv::GaussianBlur(org, org, cv::Size(5, 5), 0, 0);
cv::namedWindow("GaussianBlur", WINDOW_NORMAL);
cv::imshow("GaussianBlur", org);
cv::waitKey(0);
}
参考:https://aistudio.csdn.net/62e38a51cd38997446774bd7.html?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2defaultOPENSEARCHactivity-1-81568844-blog-105547468.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultOPENSEARCHactivity-1-81568844-blog-105547468.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=2
参考:https://blog.csdn.net/qq_38132105/article/details/105547468
相比于高斯模糊,高斯双边模糊会保存图片的细节特征
void bilateralFilter(InputArray src, OutputArray dst, int d, double sigmaColor, douboe sigmaSpace, int borderType=BORDER_DEFAULT)
高斯双边滤波既考虑了像素位置对原来像素的影响,也考虑了像素值的原来坐标点的影响。位置越远影响越小,像素相差越多影响越小。
第四个参数:double类型的sigmaColor,颜色空间滤波器的sigma值。这个值越大,表示该像素邻域内有越宽广的颜色被混合到一起,会产生较大的半相等颜色区域。
第五个参数:double类型的sigmaSpace,坐标空间中滤波器的sigma值,坐标空间的标准方差。它的值越大,则越远的像素会相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关。fouze,d正比于sigmaSpace。
void QuickDemo::bifilter_demo(Mat &image) {
Mat dst;
bilateralFilter(image, dst, 0, 10, 20);
imshow("双边模糊", dst);
}