关注、星标公众号,精彩内容每日送达
来源:网络素材在图形处理中,滤波算法是用于图像增强、去噪、边缘检测等的重要工具。介绍12种常用的滤波算法,包括算法原理、特点以及简短的代码例程。
♜均值滤波
♜中值滤波
♜高斯滤波
♜双边滤波
♜拉普拉斯滤波
♜Sobel滤波
♜Scharr滤波
♜Prewitt滤波
♜盒式滤波
♜最大值滤波
♜最小值滤波
♜维纳滤波
代码示例是使用OpenCV和NumPy库在Python中编写的。
1. 均值滤波
原理:用邻域像素的平均值代替中心像素值。
特点:简单,计算速度快,但去噪的同时会模糊图像。
python例程:
import cv2import numpy as npimg = cv2.imread('image.jpg')blur = cv2.blur(img, (5,5)) # 使用5x5的核cv2.imshow('Mean Blur', blur)cv2.waitKey(0)2. 中值滤波
原理:用邻域像素的中值代替中心像素值。
特点:对椒盐噪声有很好的去噪效果,能保留边缘。
python例程:
median = cv2.medianBlur(img, 5) # 5x5的核cv2.imshow('Median Blur', median)cv2.waitKey(0)3. 高斯滤波
原理:使用高斯函数生成的权重对邻域像素进行加权平均。
特点:去除高斯噪声,平滑效果更自然,保留边缘比均值滤波好。
python例程:
gaussian = cv2.GaussianBlur(img, (5,5), 0) # 0是标准差,由核大小自动计算cv2.imshow('Gaussian Blur', gaussian)cv2.waitKey(0)4. 双边滤波
原理:结合空间邻近度和像素值相似度,同时考虑空域和灰度相似性。
特点:在去噪的同时能保持边缘清晰,但计算量较大。
python例程:
bilateral = cv2.bilateralFilter(img, 9, 75, 75) # 直径,颜色空间标准差,坐标空间标准差cv2.imshow('Bilateral Filter', bilateral)cv2.waitKey(0)5. 拉普拉斯滤波
原理:使用拉普拉斯算子进行图像二阶导数计算,用于边缘检测。
特点:对噪声敏感,通常先进行平滑处理。
python例程:
laplacian = cv2.Laplacian(img, cv2.CV_64F)cv2.imshow('Laplacian', laplacian)cv2.waitKey(0)6.Sobel滤波
原理:使用Sobel算子计算图像的一阶梯度,分别计算x和y方向的梯度。
特点:对噪声有一定的抵抗能力,常用于边缘检测。
python例程:
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5) # x方向sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5) # y方向cv2.imshow('Sobel X', sobelx)cv2.imshow('Sobel Y', sobely)cv2.waitKey(0)7. Scharr滤波
原理:与Sobel类似,但使用不同的核,对梯度的响应更敏感。
特点:比Sobel算子有更高的精度,尤其对3x3的核。
python例程:
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)cv2.imshow('Scharr X', scharrx)cv2.imshow('Scharr Y', scharry)cv2.waitKey(0)8. Prewitt滤波
原理:使用Prewitt算子计算梯度,类似于Sobel但核不同。
特点:对水平和垂直边缘响应明显。
python例程:
kernel_x = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]])kernel_y = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]])prewittx = cv2.filter2D(img, -1, kernel_x)prewitty = cv2.filter2D(img, -1, kernel_y)cv2.imshow('Prewitt X', prewittx)cv2.imshow('Prewitt Y', prewitty)cv2.waitKey(0)9. 盒式滤波
原理:与均值滤波类似,但可以归一化,计算邻域像素的平均值。
特点:快速,可归一化。
python例程:
box = cv2.boxFilter(img, -1, (5,5), normalize=True) # normalize为True时同均值滤波cv2.imshow('Box Filter', box)cv2.waitKey(0)10. 最大值滤波
原理:用邻域像素的最大值代替中心像素值。
特点:用于寻找最亮点,膨胀操作在形态学中类似。
python例程:
max_filter = cv2.dilate(img, np.ones((5,5), np.uint8))cv2.imshow('Max Filter', max_filter)cv2.waitKey(0)11. 最小值滤波
原理:用邻域像素的最小值代替中心像素值。
特点:用于寻找最暗点,腐蚀操作在形态学中类似。
python例程:
min_filter = cv2.erode(img, np.ones((5,5), np.uint8))cv2.imshow('Min Filter', min_filter)cv2.waitKey(0)12. 维纳滤波
原理:在频率域进行去噪,假设图像和噪声均为随机过程,通过最小化均方误差来恢复图像。
特点:对高斯噪声有较好的去噪效果,但计算复杂。
python例程:
from scipy.signal import wiener# 注意:wiener滤波需要灰度图像,且scipy的wiener函数适用于2D信号gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)wiener_filtered = wiener(gray_img, (5,5))cv2.imshow('Wiener Filter', wiener_filtered.astype(np.uint8))cv2.waitKey(0)13. 导向滤波
原理:利用引导图像进行边缘保持平滑
特点:优秀边缘保持,广泛用于图像融合
python例程:
def guided_filter(I, p, radius=15, eps=0.01): # I:引导图像, p:输入图像 mean_I = cv2.boxFilter(I, cv2.CV_64F, (radius, radius)) mean_p = cv2.boxFilter(p, cv2.CV_64F, (radius, radius)) # ... 详细实现省略 return q14. 卡尔曼滤波
原理:基于状态空间模型的递归最优估计
特点:时序数据处理,预测-校正机制
python例程:
import cv2# 用于视频序列的简单卡尔曼滤波kalman = cv2.KalmanFilter(4, 2)kalman.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]], np.float32)kalman.transitionMatrix = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]], np.float32)15. 非线性扩散滤波
原理:基于偏微分方程的图像平滑
特点:各向异性扩散,优秀边缘保持
python例程:
def anisotropic_diffusion(img, iterations=10, delta=0.14, kappa=15): img = img.astype(np.float32) for _ in range(iterations):# 计算四个方向的梯度 north = np.roll(img, 1, axis=0) - img south = np.roll(img, -1, axis=0) - img east = np.roll(img, 1, axis=1) - img west = np.roll(img, -1, axis=1) - img # 扩散系数 cn = np.exp(-(north/kappa)**2) cs = np.exp(-(south/kappa)**2) ce = np.exp(-(east/kappa)**2) cw = np.exp(-(west/kappa)**2) # 更新图像 img += delta * (cn*north + cs*south + ce*east + cw*west) return np.uint8(np.clip(img, 0, 255))以上代码仅为示例,实际应用中可能需要调整参数。另外,维纳滤波使用了SciPy库,需要安装。在运行代码前,请确保已安装OpenCV和SciPy。
滤波类型 | 主要应用 | 计算复杂度 | 边缘保持 |
|---|---|---|---|
均值滤波 | 噪声平滑 | 低 | 差 |
中值滤波 | 椒盐噪声 | 中 | 较好 |
高斯滤波 | 通用平滑 | 中 | 中等 |
双边滤波 | 保边去噪 | 高 | 优秀 |
导向滤波 | 图像增强 | 高 | 优秀 |
维纳滤波 | 图像恢复 | 高 | 中等 |
选择建议:
快速平滑:均值滤波、高斯滤波
保边去噪:双边滤波、导向滤波
边缘检测:Sobel、拉普拉斯
特殊噪声:中值滤波(椒盐噪声)
时序处理:卡尔曼滤波
(全文完)
声明:我们尊重原创,也注重分享;文字、图片版权归原作者所有。转载目的在于分享更多信息,不代表本号立场,如有侵犯您的权益请及时联系,我们将第一时间删除,谢谢!

想要了解FPGA吗?这里有实例分享,ZYNQ设计,关注我们的公众号,探索
1993

被折叠的 条评论
为什么被折叠?



