- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
功能描述
cv::getGaussianKernel() 是 OpenCV 中的一个函数,用于生成一维高斯核。这种核通常用于实现高斯模糊滤波器,该滤波器可以平滑图像并减少噪声。高斯模糊是一种非常常用的图像处理技术,在许多计算机视觉任务中都有应用,比如边缘检测前的预处理。
函数返回高斯滤波器系数。
该函数计算并返回一个 ksize×1 的高斯滤波器系数矩阵:
G
i
=
α
∗
e
−
(
i
−
(
ksize
−
1
)
/
2
)
2
/
(
2
∗
sigma
2
)
,
G_i= \alpha *e^{-(i-( \texttt{ksize} -1)/2)^2/(2* \texttt{sigma}^2)},
Gi=α∗e−(i−(ksize−1)/2)2/(2∗sigma2),
其中,i=0…ksize−1 并且 而 α 是缩放因子,选择该因子是为了使得
∑
i
G
i
=
1
\sum_i G_i=1
∑iGi=1。
生成的两个这样的核可以传递给 sepFilter2D。这些函数自动识别平滑核(一个对称核,其权重之和等于 1),并相应地处理它们。您也可以使用更高层次的 GaussianBlur。
函数原型
Mat cv::getGaussianKernel
(
int ksize,
double sigma,
int ktype = CV_64F
)
参数
- 参数ksize 孔径大小。它应该是奇数 (ksizemod2=1) 并且为正数。
- 参数sigma 高斯标准差。如果它是非正数,它将根据 ksize 计算为 sigma = 0.3*((ksize-1)*0.5 - 1) + 0.8。
- 参数ktype 滤波器系数的类型。它可以是 CV_32F 或 CV_64F。
代码示例
include <opencv2/opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
// 读取图像
cv::Mat src = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/erik.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty())
{
std::cout << "Error: Image cannot be loaded!" << std::endl;
return -1;
}
cv::Size sz2Sh( 400, 600 );
cv::resize( src, src, sz2Sh, 0, 0, cv::INTER_LINEAR_EXACT );
// 获取高斯核
int ksize = 5; // 孔径大小
double sigma = 3.0;// 标准差
cv::Mat kernel = cv::getGaussianKernel(ksize, sigma, CV_64F);
// 创建二维高斯核
cv::Mat kernel2D = kernel * kernel.t();
// 应用高斯核
cv::Mat filtered;
cv::filter2D(src, filtered, -1, kernel2D);
// 显示图像
cv::namedWindow("Original Image", cv::WINDOW_NORMAL);
cv::imshow("Original Image", src);
cv::namedWindow("Filtered Image", cv::WINDOW_NORMAL);
cv::imshow("Filtered Image", filtered);
cv::waitKey(0);
return 0;
}