【OpenCv】图像模糊处理(滤波)

原理:

图像模糊又称为图像平滑,是图像处理中最简单和常用的操作之一,使用该操作就是为了给图像降低噪音。图像模糊处理包括:高斯模糊、均值滤波、中值滤波、双边滤波等。模糊滤波其实就是图像的卷积计算,通常这些卷积算子都是线性计算,所以又叫线性滤波。

图像的卷积计算

       【OpenCv】图像模糊处理(滤波)_第1张图片      【OpenCv】图像模糊处理(滤波)_第2张图片      【OpenCv】图像模糊处理(滤波)_第3张图片

                              图1                                                   图2                                                   图3

卷积过程,黄色区域(包含红色方框)成为卷积核,这是一个3*3的卷积核,灰色区域(其中部分被黄色区域覆盖)是一个6*6的图像像素,卷积核上的数值与其覆盖的灰色区域上相对应位置的数值进行相乘,最后将相乘得到的9个数值求和然后替换红色方块覆盖灰色模板上的像素值(也就是替换红色对应位置的原图像的像素。这样从左到右依次移动,不停地操作替换,每次移动一个方格,直到整个图像处理完成。注意和掩膜的区分。

均值滤波

将黄色卷积核覆盖的9个像素值求平均值代替红色方框位置的像素值。

blur(src,dst,size(x,y),point(-1,-1))-第一个参数输入图像,第二个参数输出图像,第三个参数卷积核在x,y方向的大小,                   point默认参数值为(-1,-1)代表将均值赋给卷积核的中间位置

中值滤波

将黄色卷积核对应的9个像素值按照从小到大排序,用中间位置的数值代替红色方框位置处的像素值

medianBlur(src,dst,ksize)-第一个参数输入图像,第二个参数输出图像,第三个参数卷积核大小

高斯滤波

https://www.cnblogs.com/wangguchangqing/p/6407717.html

双边滤波

https://blog.csdn.net/qq_36359022/article/details/80198890

Robert算子

                                                   

这两种都属于Robert的卷积核,即上面的黄色区域,只是处理的方向不同。

Sobel算子

                                                     

这两种都属于Sobel的卷积核,即上面的黄色区域,只是处理的方向不同。

拉普拉斯算子

                                                     

代码示例

均值滤波和高斯滤波

#include  
#include  
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	char input_title[] = "input image";
	char output_title[] = "blur image";//均值滤波输出
	namedWindow(input_title, CV_WINDOW_AUTOSIZE);
	namedWindow(output_title, CV_WINDOW_AUTOSIZE);
	imshow(input_title, src);

	blur(src, dst, Size(11, 11), Point(-1, -1));
	imshow(output_title, dst);

	Mat gblur;
	GaussianBlur(src, gblur, Size(11, 11), 11, 11);
	imshow("gaussian blur", gblur);//高斯滤波输出

	waitKey(0);
	return 0;
}

结果运行图【OpenCv】图像模糊处理(滤波)_第4张图片

从左到右依次是原图,均值滤波图,高斯滤波图

双边滤波和中值滤波

#include  
#include  
using namespace cv;

int main(int argc, char** argv) {
	Mat src, dst;
	src = imread("D:/test.png");
	if (!src.data) {
		printf("could not load image...\n");
		return -1;
	}
	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

	//medianBlur(src, dst, 3);//中值滤波
	bilateralFilter(src, dst, 15, 100, 5);//双边滤波
	namedWindow("BiBlur Filter Result", CV_WINDOW_AUTOSIZE);
	imshow("BiBlur Filter Result", dst);

	Mat resultImg;
	Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(dst, resultImg, -1, kernel, Point(-1, -1), 0);//掩膜处理,图像增强
	imshow("Final Result", resultImg);

	waitKey(0);
	return 0;

}

运行结果

双边滤波图

【OpenCv】图像模糊处理(滤波)_第5张图片

从左到右依次是原图、双边滤波图、滤波后图像增强图

中值滤波结果图

 【OpenCv】图像模糊处理(滤波)_第6张图片

从左到右依次是原图、中值滤波图、滤波后图像增强图 

你可能感兴趣的:(【OpenCv】图像模糊处理(滤波))