图形处理中常用的滤波算法

关注、星标公众号,精彩内容每日送达
来源:网络素材

在图形处理中,滤波算法是用于图像增强、去噪、边缘检测等的重要工具。介绍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 q

14. 卡尔曼滤波

原理:基于状态空间模型的递归最优估计

特点:时序数据处理,预测-校正机制

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设计,关注我们的公众号,探索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值