opencv-022-图像均值模糊与高斯模糊

知识点

均值模糊 是卷积核的系数完全一致,高斯模糊考虑了中心像素距离的影响,对距离中心像素使用高斯分布公式生成不同的权重系数给卷积核,然后用此卷积核完成图像卷积得到输出结果就是图像高斯模糊之后的输出。

参考:高斯模糊原理-阮一峰

API

void GaussianBlur(
InputArray src,
OutputArray dst,
Size ksize, // Ksize为高斯滤波器窗口大小
double sigmaX, // X方向滤波系数
double sigmaY=0, // Y方向滤波系数
int borderType=BORDER_DEFAULT // 默认边缘插值方法
)
Size(0, 0)就会从sigmaX开始计算生成高斯卷积核系数,当时size不为零时优先从size开始计算高斯卷积核系数

代码(c++,python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/*
* 均值模糊与高斯模糊
*/
int main() {
Mat src = imread("../images/test.png");
if (src.empty()) {
cout << "could not load image.." << endl;
}
imshow("input", src);

Mat dst1, dst2, dst3;
blur(src, dst1, Size(5, 5));
GaussianBlur(src, dst2, Size(5, 5), 15, 0);
GaussianBlur(src, dst3, Size(15, 15), 15, 0);

imshow("blur ksize=5", dst1);
imshow("gaussian ksize=5", dst2);
imshow("gaussian ksize=15", dst3);

waitKey(0);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import cv2 as cv
import numpy as np


src = cv.imread("D:/javaopencv/snow.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)

dst1 = cv.blur(src, (5, 5))
dst2 = cv.GaussianBlur(src, (5, 5), sigmaX=15)
dst3 = cv.GaussianBlur(src, (0, 0), sigmaX=15)

cv.imshow("blur ksize=5", dst1)
cv.imshow("gaussian ksize=5", dst2)
cv.imshow("gaussian sigmax=15", dst3)

cv.waitKey(0)
cv.destroyAllWindows()

结果

代码地址

github