图像滤波是一种非常重要的图像处理技术,图像平滑、边缘检测、边缘增强、去除噪声都属于图像滤波,图像滤波是一种基于邻域的算法。
通过图像滤波,可以实现图像平滑、边缘检测;图像平滑也叫图像模糊,用以去除图像中的噪声、伪影等,它是图像处理和计算机视觉的常见步骤。
函数 | 模糊类型 | 特点 | 使用场景 |
---|---|---|---|
cv.blur |
均值模糊 | 简单快速,所有像素权重相等 | 基础平滑和降噪 |
cv.GaussianBlur |
高斯模糊 | 中心权重高,模糊效果更自然,边缘细节保留较好 | 图像处理前降噪、边缘检测 |
cv.medianBlur |
中值模糊 | 抗噪能力强,尤其适合去除椒盐噪声 | 去噪或细节保护的平滑处理 |
均值滤波是一种简单的图像平滑方法,输出图像的每一个像素值都为其领域内的所有原始图像像素值的平均值。卷积核越大,滤波后的图像越模糊。
cv.blur
是 OpenCV 中的一种用于图像模糊处理的函数。它通过均值滤波(平均模糊)来平滑图像,减少噪声和细节。以下是其具体功能和用法详解。
cv.blur(src, ksize, dst=None, anchor=(-1, -1), borderType=cv.BORDER_DEFAULT) -> dst
src
numpy.ndarray
ksize
(width, height)
。(5, 5)
表示一个 5x5 的矩形核。dst
(可选)
anchor
(可选)
(-1, -1)
,即使用核的中心作为锚点)。borderType
(可选)
cv.BORDER_CONSTANT
:使用常量填充边界。cv.BORDER_REFLECT
:边界像素反射。cv.BORDER_REFLECT_101
:类似反射,但不重复边界像素。cv.BORDER_REPLICATE
:复制边界像素。cv.BORDER_WRAP
:边界像素从另一侧复制。cv.blur
是一种基于卷积的滤波方法。
高斯滤波是图像平滑或去噪的常用方法,高斯滤波的卷积核由高斯函数生成。
cv.GaussianBlur
是 OpenCV 中实现高斯模糊(Gaussian Blur)的函数,用于对图像进行平滑处理。相比普通均值模糊 (cv.blur
),高斯模糊采用高斯权重分布,能更自然地减少图像噪声和细节,同时保留更多边缘信息。
cv.GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=0, borderType=cv.BORDER_DEFAULT) -> dst
src
numpy.ndarray
ksize
(width, height)
,必须是奇数(如 (3, 3)
、(5, 5)
)。(0, 0)
,会根据 sigmaX
和 sigmaY
自动计算适当的核大小。sigmaX
dst
(可选)
sigmaY
(可选)
sigmaX
相同。borderType
(可选)
cv.BORDER_CONSTANT
:用常量值填充边界。cv.BORDER_REFLECT
:边界像素反射。cv.BORDER_REPLICATE
:复制边界像素。高斯模糊通过高斯函数定义的权重对图像进行卷积。高斯函数的数学公式为:
G ( x , y ) = 1 2 π σ 2 exp ( − x 2 + y 2 2 σ 2 ) G(x, y) = \frac{1}{2\pi \sigma^2} \exp\left(-\frac{x^2 + y^2}{2\sigma^2}\right) G(x,y)=2πσ21exp(−2σ2x2+y2)
σ
决定模糊效果的强弱和范围。中值滤波是将每个像素值用领域内所有像素值的中间值替代,不同于均值滤波和高斯滤波,中值滤波属于非线性滤波。
cv.medianBlur
是 OpenCV 中的一种中值模糊(Median Blur)处理函数,主要用于去噪声,尤其对椒盐噪声有很好的抑制效果。相比于均值模糊(cv.blur
)和高斯模糊(cv.GaussianBlur
),它更适合在保留边缘的同时去除噪声。
以下是 cv.medianBlur
的详解:
cv.medianBlur(src, ksize) -> dst
src
numpy.ndarray
ksize
3, 5, 7
)。返回值 dst
中值模糊是基于局部窗口(滤波核)的中值计算。具体步骤如下:
ksize × ksize
的窗口。双边滤波可以在去除噪声的同时,较好的保留图像的边缘;其卷积核综合考虑了像素间的空间距离和像素值的相似度。
cv.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst=None, borderType=cv.BORDER_DEFAULT) -> dst
src
numpy.ndarray
d
sigmaSpace
自动计算合适的值。sigmaColor
sigmaSpace
dst
(可选)
borderType
(可选)
cv.BORDER_CONSTANT
:用常量值填充边界。cv.BORDER_REFLECT
:边界像素反射。cv.BORDER_REPLICATE
:复制边界像素。双边滤波是一种非线性滤波,结合了空间和颜色的双重信息对像素值进行加权平均。其核心公式如下:
I f i l t e r e d ( p ) = 1 W p ∑ q ∈ Ω G s ( ∣ ∣ p − q ∣ ∣ ) ⋅ G r ( ∣ ∣ I ( p ) − I ( q ) ∣ ∣ ) ⋅ I ( q ) I_{filtered}(p) = \frac{1}{W_p} \sum_{q \in \Omega} G_s(||p - q||) \cdot G_r(||I(p) - I(q)||) \cdot I(q) Ifiltered(p)=Wp1q∈Ω∑Gs(∣∣p−q∣∣)⋅Gr(∣∣I(p)−I(q)∣∣)⋅I(q)
允许用户自己定义卷积核进行滤波。
cv.filter2D
是 OpenCV 中一个通用的二维卷积函数,允许用户对图像应用自定义的卷积核(滤波器)。它提供了一种灵活的方式实现各种滤波操作,例如锐化、边缘检测、模糊、浮雕效果等。
cv.filter2D(src, ddepth, kernel, dst=None, anchor=(-1, -1), delta=0, borderType=cv.BORDER_DEFAULT) -> dst
src
numpy.ndarray
。ddepth
cv.CV_8U
:8 位无符号整数(标准图像)。cv.CV_16U
:16 位无符号整数。cv.CV_16S
:16 位有符号整数。cv.CV_32F
:32 位浮点数。cv.CV_64F
:64 位浮点数。-1
,则输出图像的深度与输入图像相同。kernel
numpy.ndarray
(例如,np.array([[...], [...], [...]])
)。dst
(可选)
anchor
(可选)
(-1, -1)
,表示核的中心点是锚点。(1, 1)
。delta
(可选)
0
。borderType
(可选)
cv.BORDER_CONSTANT
:填充常数值。cv.BORDER_REFLECT
:边界像素反射。cv.BORDER_REPLICATE
:复制边界像素。cv.filter2D
的工作原理是二维卷积。对于每个像素位置 ( (x, y) ),函数将卷积核与图像的对应区域进行逐点相乘并求和。其公式为:
d s t ( x , y ) = ∑ i = 0 m − 1 ∑ j = 0 n − 1 k e r n e l ( i , j ) ⋅ s r c ( x + i − a , y + j − b ) + delta dst(x, y) = \sum_{i=0}^{m-1} \sum_{j=0}^{n-1} kernel(i, j) \cdot src(x+i-a, y+j-b) + \text{delta} dst(x,y)=i=0∑m−1j=0∑n−1kernel(i,j)⋅src(x+i−a,y+j−b)+delta
0
。import cv2 as cv
import numpy as np
# 加载图像
img = cv.imread('example.jpg', cv.IMREAD_GRAYSCALE)
# 定义卷积核(例如:简单均值模糊核)
kernel = np.ones((5, 5), np.float32) / 25
# 应用卷积
filtered_img = cv.filter2D(img, ddepth=-1, kernel=kernel)
# 显示原图和卷积结果
cv.imshow('Original', img)
cv.imshow('Filtered', filtered_img)
cv.waitKey(0)
cv.destroyAllWindows()
# 锐化核
sharpen_kernel = np.array([[ 0, -1, 0],
[-1, 5, -1],
[ 0, -1, 0]], np.float32)
# 应用锐化卷积
sharpened_img = cv.filter2D(img, ddepth=-1, kernel=sharpen_kernel)
cv.imshow('Sharpened', sharpened_img)
# 边缘检测核
edge_kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]], np.float32)
# 应用边缘检测卷积
edges_img = cv.filter2D(img, ddepth=-1, kernel=edge_kernel)
cv.imshow('Edges', edges_img)
cv.waitKey(0)
cv.destroyAllWindows()
功能 | 卷积核(Kernel) |
---|---|
均值模糊 | ( 1 9 [ 1 1 1 1 1 1 1 1 1 ] (\frac{1}{9}\begin{bmatrix}1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1\end{bmatrix} (91 111111111 |
高斯模糊 | ( [ 1 2 1 2 4 2 1 2 1 ] / 16 ) (\begin{bmatrix}1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1\end{bmatrix} / 16) ( 121242121 /16) |
锐化 | ( [ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] (\begin{bmatrix}0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0\end{bmatrix} ( 0−10−15−10−10 ) |
水平边缘检测 | ( [ − 1 − 1 − 1 0 0 0 1 1 1 ] (\begin{bmatrix}-1 & -1 & -1 \\ 0 & 0 & 0 \\ 1 & 1 & 1\end{bmatrix} ( −101−101−101 ) |
垂直边缘检测 | ( [ − 1 0 1 − 1 0 1 − 1 0 1 ] (\begin{bmatrix}-1 & 0 & 1 \\ -1 & 0 & 1 \\ -1 & 0 & 1\end{bmatrix} ( −1−1−1000111 ) |
拉普拉斯边缘检测 | ( [ − 1 − 1 − 1 − 1 8 − 1 − 1 − 1 − 1 ] (\begin{bmatrix}-1 & -1 & -1 \\ -1 & 8 & -1 \\ -1 & -1 & -1\end{bmatrix} ( −1−1−1−18−1−1−1−1 ) |
浮雕效果 | ( [ − 2 − 1 0 − 1 1 1 0 1 2 ] (\begin{bmatrix}-2 & -1 & 0 \\ -1 & 1 & 1 \\ 0 & 1 & 2\end{bmatrix} ( −2−10−111012 ) |