0%

OpenCV 中的滤镜

参考链接

OpenCV 有一些线性滤镜可以用来平滑图像。

归一化盒过滤器 (Normalized Box Filter)

很好理解,新的图像的每一个像素点都是原图像该位置附近的像素点的强度取平均。

可以有效地平滑图像,降低其尖锐程度,降低噪声(但不能消除噪声)。

1
2
3
4
5
6
7
8
9
blur(src, dst, ksize, anchor, borderType);

/*
InputArray src: 输入图片
OutputArray dst: 输出图片(要求与输入图片有相同的大小和深度)
Size ksize: 表示核的尺寸
Point anchor: 表示需要处理的像素位于核的什么位置。默认值为 Point(-1, -1),表示锚点位于内核中心。
int     borderType: 用于外推图像外部像素的边界模式。默认值为 BORDER_DEFAULT。(不支持 BORDER_WRAP )
*/

borderType 详见 这篇文章

高斯过滤器 (Gaussian Filter)

可能是最有用的过滤器。由于要计算高斯核所以会慢一些。效果比较接近现实世界中的模糊效果。

看不太懂。

1
2
3
4
5
6
7
8
9
10
11
GaussianBlur(src, dst, ksize, sigmaX, sigmaY, borderType, hint);

/*
InputArray src: 输入图片
OutputArray dst: 输出图片(要求与输入图片有相同的大小和深度)
Size ksize: 表示核的尺寸
double sigmaX: X方向上的高斯核标准差
double sigmaY: 默认为0,表示与 sigmaX 相同。
int borderType: 用于外推图像外部像素的边界模式。默认值为 BORDER_DEFAULT。(不支持 BORDER_WRAP )
AlgorithmHint hint: 没明白。感觉没啥用。
*/

中位数过滤器 (Median Filter)

每个位置附近像素值的中位数。

效果有点像融化后混合了。

1
2
3
4
5
6
7
medianBlur(src, dst, ksize);

/*
InputArray src: 输入图片
OutputArray dst: 输出图片(要求与输入图片有相同的大小和深度)
int ksize: 表示核的尺寸(ksize * ksize)
*/

双边过滤器 (Bilateral Filter)

比较好地保留边界的前提下使色块内部变得平滑。

据说可以应用在初步的美颜上。

原理没太搞懂,大概就是像素值差与距离差同时考虑后得到的卷积核。

是结合图像的空间邻近度像素值相似度的一种折中处理。

1
2
3
4
5
6
7
8
9
10
bilateralFilter    (src, dst, d, sigmaColor, sigmaSpace, borderType);

/*
InputArray src: 输入图片
OutputArray dst: 输出图片(要求与输入图片有相同的大小和深度)
int d: 从当前像素选择的邻近区域的直径。
double sigmaColor:值域的 sigma。控制颜色差异的影响,影响图像的边缘保护能力。
double sigmaSpace:空间域的 sigma。控制空间距离的影响,决定平滑效果的范围和程度。
int borderType:用于外推图像外部像素的边界模式。默认值为 BORDER_DEFAULT。
*/
  • sigmaColor(颜色空间中的标准差)

    • 这个参数控制的是颜色相似度的影响。它决定了相邻像素之间的颜色差异在滤波过程中有多大的影响。
    • sigmaColor 较大时,即使像素之间的颜色差异较大,它们也会相互影响较多,因此滤波器会更倾向于平滑颜色变化较大的区域。
    • 反之,如果 sigmaColor 较小,滤波器只会在颜色相近的像素之间进行平滑,从而保留更多的颜色边缘和细节。
  • sigmaSpace(空间距离中的标准差)

    • 这个参数控制的是空间距离的影响,即考虑多远的像素在滤波时应该被包括进来。
    • sigmaSpace 较大时,滤波器会在更大范围内对像素进行平滑处理,可能会产生较大的模糊效果。
    • 如果 sigmaSpace 较小,只有靠近的像素会对滤波结果产生显著影响,这样可以更好地保留细节但减少模糊的效果。