OpenCV图像模糊:高斯滤波、双边滤波

一、高斯模糊

1.高斯滤波原理

图像处理中,高斯滤波主要可以使用两种方法实现。一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化。离散化窗口划船卷积时主要利用的是高斯核,高斯核的大小为奇数,因为高斯卷积会在其覆盖区域的中心输出结果。常用的高斯模板有如下几种形式:
OpenCV图像模糊:高斯滤波、双边滤波_第1张图片
高斯模板是通过高斯函数计算出来的,公式如下:
OpenCV图像模糊:高斯滤波、双边滤波_第2张图片
从以上描述中我们可以看出,高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度,如果σ较小,那么生成的模板中心系数越大,而周围的系数越小,这样对图像的平滑效果就不是很明显;相反,σ较大时,则生成的模板的各个系数相差就不是很大,比较类似于均值模板,对图像的平滑效果就比较明显。

2.GaussianBlur函数

(1)函数原型:
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。

OpenCV图像模糊:高斯滤波、双边滤波_第3张图片

(2)调节delta参数

利用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);
}
(3)应用例子
//高斯模糊,中心占得比重最大
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);
}

你可能感兴趣的:(opencv,计算机视觉,opencv,深度学习)