王乐予已于 2024-01-06 18:11:11 修改阅读量1w 收藏 265点赞数 33分类专栏: 图像处理 文章标签: 计算机视觉 python opencv 图像处理版权华为开发者空间该内容已被华为云开发者联盟社区收录加入社区图像处理专栏收录该内容30 篇文章订阅专栏✨博客主页:王乐予🎈✨年轻人要:Living for the moment(活在当下)!💪🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】目录😺一、引言🐶1.1 图像用例🐶1.2 评价指标🐶1.3 定义图像质量评价函数😺二、均值滤波🐶2.1 滤波原理🐶2.2 实验过程🦄2.2.1 程序设计🦄2.2.2 实验结果🦄2.2.3 指标参数😺三、中值滤波🐶3.1 滤波原理🐶3.2 实验过程🦄3.2.1 程序设计🦄3.2.2 实验结果🦄3.2.3 指标参数😺四、方框滤波🐶4.1 滤波原理🐶4.2 实验过程🦄4.2.1 程序设计🦄4.2.2 实验结果🦄4.2.3 指标参数😺五、双边滤波🐶5.1 滤波原理🐶5.2 实验过程🦄5.2.1 程序设计🦄5.2.2 实验结果🦄5.2.3 指标参数😺六、高斯滤波🐶6.1 滤波原理🐶6.2 实验过程🦄6.2.1 程序设计🦄6.2.2 实验结果🦄6.2.3 指标参数😺七、全部代码本节将对经过噪声污染的图像进行去噪,去噪方法包含均值滤波、中值滤波、方框滤波、双边滤波和高斯滤波。😺一、引言🐶1.1 图像用例实验所用的图像为【OpenCV-Python】:对图像添加高斯噪声与椒盐噪声中得到的均值为0,方差为0.01的高斯噪声污染图像和噪声密度为0.05的椒盐噪声污染图像,如图所示:🐶1.2 评价指标为了评判去噪质量的好坏,我们将选取PSNR、SSIM和MSE作为评价指标!评价指标见:【OpenCV-Python】:图像PSNR、SSIM、MSE计算🐶1.3 定义图像质量评价函数def compare(ori, gaussian_denosing, sp_denosing): # ori为原图(未被噪声污染的图),gaussian_denosing为经过高斯噪声污染的图通过去噪算法去噪后的图;sp_denosing为经过椒盐噪声污染的图通过去噪算法去噪后的图 gaussian_psnr = compare_psnr(ori, gaussian_denosing) sp_psnr = compare_psnr(ori, sp_denosing) gaussian_ssim = compare_ssim(ori, gaussian_denosing, multichannel=True) sp_ssim = compare_ssim(ori, sp_denosing, multichannel=True) gaussian_mse = compare_mse(ori, gaussian_denosing) sp_mse = compare_mse(ori, sp_denosing) return gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse12345678910111213😺二、均值滤波🐶2.1 滤波原理均值滤波也称线性滤波,它是指使用一个模板在原图上进行均值计算并替换原图的值。均值滤波器的模板有标准像素平均和加权平均之分,一个3 × 3 3×33×3大小的模板如下图所示:🐶2.2 实验过程使用函数:cv2.blur()🦄2.2.1 程序设计"""均值滤波"""gaussian_blur = cv2.blur(gaussian_img, (3, 3))sp_blur = cv2.blur(sp_img, (3, 3))h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imshow('out', v)cv2.waitKey()12345678910🦄2.2.2 实验结果第一幅图为被高斯噪声污染的图像;第二幅图为使用均值滤波对第一幅图去噪后的图像;第三幅图为被椒盐噪声污染的图像;第四幅图为使用均值滤波对第三幅图去噪后的图像。🦄2.2.3 指标参数gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('均值滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('均值滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))123结果为:均值滤波对高斯噪声污染图像去噪后的指标为:PSNR:27.51495578617511,SSIM:0.7044879580272968,MSE:115.23509979248047均值滤波对椒盐噪声污染图像去噪后的指标为:PSNR:25.66665449076371,SSIM:0.5821969899711158,MSE:176.3660189310709512从指标结果可以看出,均值滤波对高斯噪声的去除能力更强!😺三、中值滤波🐶3.1 滤波原理中值滤波是把图像中的一点用该点的一个邻域中的各值的中值代替。🐶3.2 实验过程使用函数:cv2.medianBlur()🦄3.2.1 程序设计gaussian_blur = cv2.medianBlur(gaussian_img, (3, 3))sp_blur = cv2.medianBlur(sp_img, (3, 3))h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\median_filter.jpg", v)cv2.imshow('out', v)cv2.waitKey()12345678🦄3.2.2 实验结果第一幅图为被高斯噪声污染的图像;第二幅图为使用中值滤波对第一幅图去噪后的图像;第三幅图为被椒盐噪声污染的图像;第四幅图为使用中值滤波对第三幅图去噪后的图像。🦄3.2.3 指标参数gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('中值滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('中值滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))123结果为:中值滤波对高斯噪声污染图像去噪后的指标为:PSNR:26.882078435438537,SSIM:0.6406334892144118,MSE:133.31300481160483中值滤波对椒盐噪声污染图像去噪后的指标为:PSNR:28.5392567826037,SSIM:0.7218574470291008,MSE:91.023741404215512从指标结果可以看出,中值滤波对椒盐噪声的去除能力更强!😺四、方框滤波🐶4.1 滤波原理方框滤波又称盒子滤波,方框滤波中可以自由选择是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素值之和的平均值(均值滤波),还是邻域像素值之和。也就是说均值滤波是方框滤波的特殊情况。方框滤波卷积核可以表示为:K = 1 α [ 1 1 1 ⋯ 1 1 1 1 1 ⋯ 1 1 ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ 1 1 1 ⋯ 1 1 1 1 1 ⋯ 1 1 1 1 1 ⋯ 1 1 ] K=\frac{1}{\alpha }⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢11⋯11111⋯11111⋯111⋯⋯⋯⋯⋯⋯11⋯11111⋯111⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥[111⋯11111⋯11⋯⋯⋯⋯⋯⋯111⋯11111⋯11111⋯11]K= α1 11⋯111 11⋯111 11⋯111 ⋯⋯⋯⋯⋯⋯ 11⋯111 11⋯111 上式的对应关系为:α = { 1 w i d t h × h e i g h t n o r m a l i z e = 1 1 n o r m a l i z e = 0 \alpha =\left\{1width×height1normalize=1normalize=01𝑤𝑖𝑑𝑡ℎ×ℎ𝑒𝑖𝑔ℎ𝑡𝑛𝑜𝑟𝑚𝑎𝑙𝑖𝑧𝑒=11𝑛𝑜𝑟𝑚𝑎𝑙𝑖𝑧𝑒=0\right.α={ width×height1 1 normalize=1normalize=0 🐶4.2 实验过程使用函数:cv2.boxFilter(src, ddepth, ksize, anchor, normalize, borderType)参数说明:src:输入图像;ddepth:图像深度,-1表示用原图深度;ksize:内核大小;anchor:锚点,默认为(-1,-1),表示当前计算均值的点位于核的中心点位置;normalize:表示是否进行归一化处理,值为1,进行归一化处理;值为0,不进行归一化处理;borderType:表示以何种方式处理边界,默认即可。🦄4.2.1 程序设计"""方框滤波"""gaussian_blur = cv2.boxFilter(gaussian_img, -1, (3, 3), normalize=0)sp_blur = cv2.boxFilter(sp_img, -1, (3, 3), normalize=0)h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\box_filter.jpg", v)cv2.imshow('out', v)cv2.waitKey()1234567891011🦄4.2.2 实验结果第一幅图为被高斯噪声污染的图像;第二幅图为使用方框滤波对第一幅图去噪后的图像;第三幅图为被椒盐噪声污染的图像;第四幅图为使用方框滤波对第三幅图去噪后的图像。由图可知,不经过归一化的方框滤波很容易出现大面积的白色。🦄4.2.3 指标参数gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('方框滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('方框滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))123结果为:方框滤波对高斯噪声污染图像去噪后的指标为:PSNR:5.251255346836561,SSIM:0.415694536225471,MSE:19406.84003829956方框滤波对椒盐噪声污染图像去噪后的指标为:PSNR:5.328992238651672,SSIM:0.41684132817868463,MSE:19062.55619684855312😺五、双边滤波🐶5.1 滤波原理双边滤波是一种非线性的滤波方法,其同时考虑空间几何距离与灰度相似性。🐶5.2 实验过程使用函数:cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])参数说明:src:输入图像;d:滤波期间使用的每个像素邻域的直径,如果其值为非正数,则从sigmaSpace计算;sigmaColor:在颜色空间中过滤sigma,较大的参数意味着像素邻域内较远的颜色将相互影响;sigmaSpace:在几何空间中过滤sigma,较大的参数意味着更远的像素将相互影响;🦄5.2.1 程序设计"""双边滤波"""gaussian_blur = cv2.bilateralFilter(gaussian_img, 25, 100, 100)sp_blur = cv2.bilateralFilter(sp_img, 25, 100, 100)h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\bilateral_filter.jpg", v)cv2.imshow('out', v)cv2.waitKey()1234567891011🦄5.2.2 实验结果第一幅图为被高斯噪声污染的图像;第二幅图为使用双边滤波对第一幅图去噪后的图像;第三幅图为被椒盐噪声污染的图像;第四幅图为使用双边滤波对第三幅图去噪后的图像。🦄5.2.3 指标参数gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('双边滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('双边滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))123结果为:双边滤波对高斯噪声污染图像去噪后的指标为:PSNR:25.992916512934414,SSIM:0.6635250024737996,MSE:163.60203806559244双边滤波对椒盐噪声污染图像去噪后的指标为:PSNR:21.06964250996061,SSIM:0.3879879230675302,MSE:508.295318603515612从指标结果可以看出,双边滤波对高斯噪声的去除能力更强!😺六、高斯滤波🐶6.1 滤波原理在实际滤波中,将当前像素作为核中心,利用卷积核对周围邻域像素作加权平均,其值作为当前像素的新值。高斯滤波步骤:移动相关核的中心元素,使它位于输入图像待处理像素的正上方;将输入图像的像素值作为权重,乘以相关核;将上面各步得到的结果相加做为输出。简单来说就是根据高斯分布得到高斯模板然后做卷积相加的一个过程。https://www.cnblogs.com/kensporger/p/11628050.htmlhttps://www.jianshu.com/p/73e6ccbd8f3f🐶6.2 实验过程使用函数:cv2.GaussianBlur(src, ksize, sigmaX [ , dst [ , sigmaY [ , borderType ] ] ] )参数说明:src:输入图像;ksize:高斯核大小,必须是正数和奇数;sigmaX:X方向的高斯核标准差;sigmaY:Y方向的高斯核标准差;如果该值为0,则默认为与sigma相等。borderType:边界处理方式。🦄6.2.1 程序设计"""高斯滤波"""gaussian_blur = cv2.GaussianBlur(gaussian_img, (5, 5), 0, 0)sp_blur = cv2.GaussianBlur(sp_img, (5, 5), 0, 0)h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\gaussian_filter.jpg", v)cv2.imshow('out', v)cv2.waitKey()1234567891011🦄6.2.2 实验结果第一幅图为被高斯噪声污染的图像;第二幅图为使用高斯滤波对第一幅图去噪后的图像;第三幅图为被椒盐噪声污染的图像;第四幅图为使用高斯滤波对第三幅图去噪后的图像。🦄6.2.3 指标参数gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('高斯滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('高斯滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))123结果为:高斯滤波对高斯噪声污染图像去噪后的指标为:PSNR:27.80345326784865,SSIM:0.7496298168722767,MSE:107.82886505126953高斯滤波对椒盐噪声污染图像去噪后的指标为:PSNR:26.360239863855103,SSIM:0.6420068535144939,MSE:150.3337097167968812从指标结果可以看出,高斯滤波对高斯噪声的去除能力更强!😺七、全部代码import numpy as npimport cv2from skimage.measure import compare_ssim, compare_psnr, compare_mseoriginal = cv2.imread(r"C:\Users\Lenovo\Desktop\DIP\lena1.jpg")gaussian_img = cv2.imread(r"C:\Users\Lenovo\Desktop\DIP\gaussian.jpg")sp_img = cv2.imread(r"C:\Users\Lenovo\Desktop\DIP\sp.jpg")def compare(ori, gaussian_denosing, sp_denosing): # ori为原图(未被噪声污染的图),gaussian_denosing为经过高斯噪声污染的图通过去噪算法去噪后的图;sp_denosing为经过椒盐噪声污染的图通过去噪算法去噪后的图 gaussian_psnr = compare_psnr(ori, gaussian_denosing) sp_psnr = compare_psnr(ori, sp_denosing) gaussian_ssim = compare_ssim(ori, gaussian_denosing, multichannel=True) sp_ssim = compare_ssim(ori, sp_denosing, multichannel=True) gaussian_mse = compare_mse(ori, gaussian_denosing) sp_mse = compare_mse(ori, sp_denosing) return gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse"""均值滤波"""gaussian_blur = cv2.blur(gaussian_img, (3, 3))sp_blur = cv2.blur(sp_img, (3, 3))h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\mean_filter.jpg", v)cv2.imshow('out', v)cv2.waitKey()gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('均值滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('均值滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))"""中值滤波"""gaussian_blur = cv2.medianBlur(gaussian_img, 3)sp_blur = cv2.medianBlur(sp_img, 3)h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desktop\DIP\median_filter.jpg", v)cv2.imshow('out', v)cv2.waitKey()gaussian_psnr, sp_psnr, gaussian_ssim, sp_ssim, gaussian_mse, sp_mse = compare(original, gaussian_blur, sp_blur)print('中值滤波对高斯噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(gaussian_psnr, gaussian_ssim, gaussian_mse))print('中值滤波对椒盐噪声污染图像去噪后的指标为:PSNR:{},SSIM:{},MSE:{}'.format(sp_psnr, sp_ssim, sp_mse))"""方框滤波"""gaussian_blur = cv2.boxFilter(gaussian_img, -1, (3, 3), normalize=0)sp_blur = cv2.boxFilter(sp_img, -1, (3, 3), normalize=0)h1 = np.hstack([gaussian_img, gaussian_blur])h2 = np.hstack([sp_img, sp_blur])v = np.vstack([h1, h2])cv2.imwrite(r"C:\Users\Lenovo\Desk
时间: 2025-06-26 14:13:35 浏览: 13
### 不同滤波方法对图像去噪的效果
#### 效果对比
1. **高斯滤波**
高斯滤波是一种线性平滑滤波器,适用于去除高斯噪声。其核心思想是对图像中的每个像素与其周围的像素进行加权平均,权重由高斯分布决定,距离中心像素越远的像素权重越小[^1]。因此,在去除高斯噪声方面表现良好。
2. **均值滤波**
均值滤波通过计算邻域内所有像素的平均值来替代当前像素值,从而达到平滑效果。这种方法对于随机噪声有一定的抑制作用,但在处理椒盐噪声时可能会模糊边缘细节[^4]。
3. **中值滤波**
中值滤波是一种非线性滤波技术,特别适合于去除椒盐噪声。它通过取邻域内的中值作为新像素值,能够有效保留图像的边缘信息而不失真[^5]。
4. **方框滤波**
方框滤波是最简单的滤波方式之一,输出像素值是内核邻域像素值的平均值。尽管实现简单,但它容易导致图像过度模糊,尤其是在边界区域[^2]。
5. **双边滤波**
双边滤波不仅考虑空间距离还考虑像素强度差异,能够在保持边缘的同时减少噪声。相比其他滤波器,双边滤波更适合复杂场景下的图像去噪[^3]。
---
### Python 实现代码示例
以下是五种滤波方法在 OpenCV 和 NumPy 下的具体实现:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加载带有噪声的图片 (假设已存在一张名为 'noisy_image.jpg' 的图片)
image = cv2.imread('noisy_image.jpg', 0)
# 添加高斯噪声和椒盐噪声用于测试
gaussian_noise_img = cv2.GaussianNoise(image, mean=0, sigma=25) # 自定义函数模拟高斯噪声
salt_pepper_noise_img = cv2.addSaltPepperNoise(image, salt_prob=0.01, pepper_prob=0.01) # 自定义函数模拟椒盐噪声
# 定义不同的滤波操作
def apply_filters(noise_type='gaussian'):
if noise_type == 'gaussian':
noisy_image = gaussian_noise_img.copy()
elif noise_type == 'salt_pepper':
noisy_image = salt_pepper_noise_img.copy()
box_filtered = cv2.boxFilter(noisy_image, -1, (3, 3)) # 方框滤波
blur_filtered = cv2.blur(noisy_image, (3, 3)) # 均值滤波
gaussian_filtered = cv2.GaussianBlur(noisy_image, (3, 3), 0) # 高斯滤波
median_filtered = cv2.medianBlur(noisy_image, 3) # 中值滤波
bilateral_filtered = cv2.bilateralFilter(noisy_image, d=9, sigmaColor=75, sigmaSpace=75) # 双边滤波
return {
"Original": noisy_image,
"Box Filtered": box_filtered,
"Mean Filtered": blur_filtered,
"Gaussian Filtered": gaussian_filtered,
"Median Filtered": median_filtered,
"Bilateral Filtered": bilateral_filtered
}
# 显示结果
results_gaussian = apply_filters('gaussian')
results_salt_pepper = apply_filters('salt_pepper')
fig, axes = plt.subplots(2, 6, figsize=(20, 8))
for i, key in enumerate(results_gaussian.keys()):
axes[0][i].imshow(results_gaussian[key], cmap="gray")
axes[0][i].set_title(key)
axes[0][i].axis("off")
for j, key in enumerate(results_salt_pepper.keys()):
axes[1][j].imshow(results_salt_pepper[key], cmap="gray")
axes[1][j].set_title(f"{key} (Salt & Pepper)")
axes[1][j].axis("off")
plt.tight_layout()
plt.show()
```
上述代码展示了如何应用各种滤波器并可视化它们的效果。注意需要自定义 `cv2.GaussianNoise` 和 `cv2.addSaltPepperNoise` 函数以生成特定类型的噪声。
---
### 总结
- 对于 **高斯噪声**,推荐使用 **高斯滤波** 或 **双边滤波**,因为这两种方法能更好地平衡降噪和平滑程度。
- 对于 **椒盐噪声**,建议优先选择 **中值滤波**,因为它擅长保护边缘结构而不会显著模糊图像。
---
阅读全文
相关推荐













