算法与深度学习·

图像滤波和图像锐化原理和代码-动手学计算机视觉3.1

介绍椒盐噪声、高斯噪声两类典型图像噪声,以及去除它们的线性和非线性滤波器。后半部分讲拉普拉斯锐化等图像锐化方法,附实现代码。

首发于 CSDN原文链接

本篇目录8 节
目录
图像滤波基础概念
滤波的核心作用
典型图像噪声类型
椒盐噪声(Salt-and-Pepper Noise)
高斯噪声(Gaussian Noise)
实际上,椒盐噪声和高斯噪声随时随地会出现在我们的生活中。图像的美颜处理中,人脸“祛痘”、人脸“磨皮”等就是通过滤波去除椒盐噪声和高斯噪声。接下来,我们将从实际的例子出发,介绍几种不同的滤波技术。
典型滤波器分类
线性滤波器
非线性滤波器
图像锐化(Image Sharpening)是一种增强图像边缘和细节的技术,通常通过高通滤波器(如拉普拉斯算子、Sobel算子等)或反锐化掩模(Unsharp Masking)实现。以下是几种常见的图像锐化方法及其实现代码。
1. 拉普拉斯锐化(Laplacian Sharpening)
代码实现
说明
2. Sobel 锐化(Sobel Sharpening)
代码实现
说明
3. 反锐化掩模(Unsharp Masking)
代码实现
说明
4. 自定义锐化核(Custom Sharpening Kernel)
代码实现
说明
小结:

图像滤波基础概念

滤波源自
信号处理
领域,指通过修改图像的频谱(频域表示)来改变图像特性。图像频谱中,高频信息对应像素值剧烈变化的区域(如边缘、细节),低频信息对应像素值平缓的区域(如平滑背景)。

滤波的核心作用

  • 去噪(Image Denoising):通过抑制高频信息(如高斯滤波)平滑图像,减少噪声。
  • 锐化(Image Sharpening):通过增强高频信息(如拉普拉斯滤波)突出边缘和细节。
  • 滤波器是实现特定频域操作的函数,通常通过卷积运算作用于图像。

典型图像噪声类型

椒盐噪声(Salt-and-Pepper

Noise
)
  • 特征:随机出现的黑白像素点(类似椒盐颗粒)。
  • 成因:传感器故障或传输错误。
  • 代码:
import cv2,skimage import numpy as np # 原图 srcImg = cv2.imread("lenna.jpg") cv2.imshow("src image", srcImg) # 给图像增加高斯噪声 noiseImg = skimage.util.random_noise(srcImg, mode='s&p') cv2.imshow("image with noise", noiseImg) # 0 表示无限等待,直到用户按下任意键,不等待图片会一瞬间消失 cv2.waitKey(0) cv2.destroyAllWindows() # 关闭所有 OpenCV 窗口

高斯噪声(Gaussian Noise)

  • 特征:像素值添加符合高斯分布的随机扰动。
  • 成因:光照不足或电子干扰。
  • 代码:
import cv2,skimage import numpy as np # 原图 srcImg = cv2.imread("lenna.jpg") cv2.imshow("src image", srcImg) # 给图像增加高斯噪声 noiseImg = skimage.util.random_noise(srcImg, mode='gaussian') cv2.imshow("image with noise", noiseImg) # 0 表示无限等待,直到用户按下任意键,不等待图片会一瞬间消失 cv2.waitKey(0) cv2.destroyAllWindows() # 关闭所有 OpenCV 窗口

其中噪声可选
- gaussian:高斯加性噪声
- localvar:高斯加性噪声,每点具有特定局部方差
- poisson: 泊松分布噪声
- salt:盐噪声,随机用1替换像素
- pepper:胡椒噪声,随机用0或-1替换像素
- s&p:椒盐噪声,呈现出黑白杂点

实际上,椒盐噪声和高斯噪声随时随地会出现在我们的生活中。图像的美颜处理中,人脸“祛痘”、人脸“磨皮”等就是通过滤波去除椒盐噪声和高斯噪声。接下来,我们将从实际的例子出发,介绍几种不同的滤波技术。

####

典型

滤波器
分类

线性

滤波器
  • 均值滤波:实现人脸磨皮,对像素进行平均,去除高频噪声,邻域像素平均值平滑噪声,但模糊边缘。
  • 核函数示例(3×3):
notion image
  • 代码
import cv2,skimage import numpy as np from matplotlib import pyplot as plt import seaborn as sns class conv_2d(): def __init__(self, a, b): # 输入图像 self.a = a # 卷积核 self.b = b # 输入图像的坐标 self.ax = [i for i in range(self.a.shape[0])] self.ay = [i for i in range(self.a.shape[1])] # 卷积核的坐标 self.bx = [i for i in range(self.b.shape[0])] self.by = [i for i in range(self.b.shape[1])] def conv(self): # 对输入图像a和卷积核b进行数学上的卷积操作 c = cv2.filter2D(self.a, -1, self.b) return c def plot(self): a = self.a b = self.b c = self.conv() plt.figure(figsize=(12, 4)) # 输入图像 plt.subplot(1, 3, 1) plt.title('Input') # 灰度图 plt.imshow(a, cmap='gray') plt.axis('off') # 卷积核 plt.subplot(1, 3, 2) plt.title('Kernel') sns.heatmap(b, annot=False, cmap='Greens', cbar=False) plt.axis('off') # 输出图像 plt.subplot(1, 3, 3) plt.title('Output') plt.imshow(c, cmap='gray') plt.axis('off') plt.tight_layout() plt.show() # 原图 srcImg = cv2.imread("lenna.jpg",0) size=5 k=np.ones((size,size))/size** 2 cov = conv_2d(srcImg , k) cov.plot() # 无法显示img如果你是linux系统,可以尝试安装以下包无 GUI 模式): # pip uninstall opencv-python opencv-contrib-python # pip install opencv-python-headless
  • 高斯滤波:加权平均,权重服从高斯分布,保留更多边缘信息。解决了均值滤波的缺点:块状效应
  • 代码
  • ```python
  1. import cv2,skimage
  1. import numpy as np
  1. from matplotlib import pyplot as plt
  1. import seaborn as sns
  1. # 原图
  1. srcImg = cv2.imread("lenna.jpg",0)
  1. # 高斯核大小为5,标准差为1.0
  1. blurred_img = cv2.GaussianBlur(srcImg, (5, 5), sigmaX=1.0)
  1. plt.imshow(blurred_img, cmap='gray')
  1. plt.title("OpenCV Gaussian Blur")
  1. plt.axis('off')
  1. plt.show()AI代码解释python运行
通过对比输入图像和输出图像,可以很明显地看出,高斯噪声被有效地抑制了。我们改变 高斯核的大小,并再次测试。 ##### 非线性滤波器 - **中值滤波**:“祛痘”也是美颜修图时的一个常用操作。人脸上的“痘”其实就是一种椒盐噪声。我们先试试高斯滤波器对椒盐噪声进行处理的效果,观察高斯滤波器能否有效“祛痘”。取邻域像素中值,有效去除椒盐噪声且保留边缘。 - ```python 1. import cv2 2. import numpy as np 3. from matplotlib import pyplot as plt 4. 5. # 读取图像(灰度模式) 6. srcImg = cv2.imread("lenna.jpg", 0) 7. if srcImg is None: 8. raise ValueError("Image not found or unable to load.") 9. 10. # 添加椒盐噪声(模拟噪声) 11. def add_salt_pepper_noise(image, salt_prob=0.05, pepper_prob=0.05): 12. noisy = np.copy(image) 13. total_pixels = image.size 14. # 添加盐噪声(白色点) 15. salt_pixels = int(total_pixels * salt_prob) 16. salt_coords = [np.random.randint(0, i-1, salt_pixels) for i in image.shape] 17. noisy[salt_coords[0], salt_coords[1]] = 255 18. # 添加胡椒噪声(黑色点) 19. pepper_pixels = int(total_pixels * pepper_prob) 20. pepper_coords = [np.random.randint(0, i-1, pepper_pixels) for i in image.shape] 21. noisy[pepper_coords[0], pepper_coords[1]] = 0 22. return noisy 23. 24. # 添加噪声 25. noisy_img = add_salt_pepper_noise(srcImg) 26. 27. # 中值滤波 28. median_filtered = cv2.medianBlur(noisy_img, 5) # 5x5 邻域 29. 30. # 显示结果 31. plt.figure(figsize=(15, 5)) 32. plt.subplot(1, 3, 1) 33. plt.imshow(srcImg, cmap='gray') 34. plt.title("Original Image") 35. plt.axis('off') 36. 37. plt.subplot(1, 3, 2) 38. plt.imshow(noisy_img, cmap='gray') 39. plt.title("Noisy Image (Salt & Pepper)") 40. plt.axis('off') 41. 42. plt.subplot(1, 3, 3) 43. plt.imshow(median_filtered, cmap='gray') 44. plt.title("Median Filtered (5x5)") 45. plt.axis('off') 46. 47. plt.show()
  • 双边滤波:结合空间距离和像素值相似性,平滑噪声同时保护边缘。
  • 高斯滤波器虽然能得到很好的去噪效果,但是由结果可知,图像的内容也被模糊
了,如人脸的五官变得模糊了,眼球和眼白之间也出现了灰色的部分。这是高斯滤波器在滤波
的过程中将白色区域与黑色区域进行加权叠加导致的。那么,有没有什么办法能解决这个问题?
这时候,就需要引入一个新的滤波器一双边滤波器,其能够在有效地处理高斯噪声的同时,
保持图像内容的清晰。
  • ```python
  1. import cv2
  1. from matplotlib import pyplot as plt
  1. # 原图
  1. srcImg = cv2.imread("lenna.jpg",0)
  1. # 5:滤波器的直径(邻域大小
  1. # 100:颜色空间的标准差(控制颜色相似性)
  1. # 100:坐标空间的标准差(控制空间相似性
  1. blurred_img = cv2.bilateralFilter(srcImg, 5, 100, 100)
  1. plt.imshow(blurred_img, cmap='gray')
  1. plt.title("OpenCV Bilateral Filter")
  1. plt.axis('off')
  1. plt.show()AI代码解释python运行
--- ## 图像锐化( Image Sharpening)是一种增强图像边缘和细节的技术,通常通过高通滤波器(如拉普拉斯算子、Sobel算子等)或反锐化掩模(Unsharp Masking)实现。以下是几种常见的图像锐化方法及其实现代码。 --- ### **1\. 拉普拉斯锐化(Laplacian Sharpening)** 拉普拉斯算子是一种二阶微分算子,可以突出图像中的边缘和细节。 #### **代码实现**
  1. import cv2
  1. import numpy as np
  1. from matplotlib import pyplot as plt
4.
  1. # 读取图像(灰度模式)
  1. srcImg = cv2.imread("lenna.jpg", 0)
  1. if srcImg is None:
  1. raise ValueError("Image not found or unable to load.")
9.
  1. # 拉普拉斯算子
  1. laplacian = cv2.Laplacian(srcImg, cv2.CV_64F)
12.
  1. # 锐化图像(原图 + 拉普拉斯结果)
  1. sharpened = srcImg - 0.5 * laplacian # 系数可调整
15.
  1. # 显示结果
  1. plt.figure(figsize=(15, 5))
  1. plt.subplot(1, 3, 1)
  1. plt.imshow(srcImg, cmap='gray')
  1. plt.title("Original Image")
  1. plt.axis('off')
22.
  1. plt.subplot(1, 3, 2)
  1. plt.imshow(laplacian, cmap='gray')
  1. plt.title("Laplacian Filter")
  1. plt.axis('off')
27.
  1. plt.subplot(1, 3, 3)
  1. plt.imshow(sharpened, cmap='gray')
  1. plt.title("Sharpened Image")
  1. plt.axis('off')
32.
  1. plt.show()
AI代码解释python运行
#### **说明** - `cv2.Laplacian` 计算图像的拉普拉斯结果。 - 锐化公式:`sharpened = original + k * laplacian`,其中 `k` 是锐化强度(通常为负数,如 `-0.5`)。 --- ### **2\. Sobel 锐化(Sobel Sharpening)** Sobel 算子是一种一阶微分算子,可以检测水平和垂直方向的边缘。 #### **代码实现**
  1. # Sobel 算子(水平和垂直方向)
  1. sobel_x = cv2.Sobel(srcImg, cv2.CV_64F, 1, 0, ksize=3)
  1. sobel_y = cv2.Sobel(srcImg, cv2.CV_64F, 0, 1, ksize=3)
4.
  1. # 合并 Sobel 结果
  1. sobel = np.sqrt(sobel_x2 + sobel_y2)
7.
  1. # 锐化图像
  1. sharpened_sobel = srcImg + 0.1 * sobel # 系数可调整
10.
  1. # 显示结果
  1. plt.figure(figsize=(15, 5))
  1. plt.subplot(1, 3, 1)
  1. plt.imshow(srcImg, cmap='gray')
  1. plt.title("Original Image")
  1. plt.axis('off')
17.
  1. plt.subplot(1, 3, 2)
  1. plt.imshow(sobel, cmap='gray')
  1. plt.title("Sobel Filter")
  1. plt.axis('off')
22.
  1. plt.subplot(1, 3, 3)
  1. plt.imshow(sharpened_sobel, cmap='gray')
  1. plt.title("Sharpened Image (Sobel)")
  1. plt.axis('off')
27.
  1. plt.show()
AI代码解释python运行
#### **说明** - `cv2.Sobel` 分别计算水平和垂直方向的梯度。 - 锐化公式:`sharpened = original + k * sobel`,其中 `k` 控制锐化强度。 --- ### **3\. 反锐化掩模(Unsharp Masking)** 反锐化掩模通过从原图中减去模糊后的图像来增强边缘。 #### **代码实现**
  1. # 高斯模糊
  1. blurred = cv2.GaussianBlur(srcImg, (5, 5), 0)
3.
  1. # 反锐化掩模
  1. unsharp_mask = srcImg - blurred
  1. sharpened_unsharp = srcImg + 0.5 * unsharp_mask # 系数可调整
7.
  1. # 显示结果
  1. plt.figure(figsize=(15, 5))
  1. plt.subplot(1, 3, 1)
  1. plt.imshow(srcImg, cmap='gray')
  1. plt.title("Original Image")
  1. plt.axis('off')
14.
  1. plt.subplot(1, 3, 2)
  1. plt.imshow(unsharp_mask, cmap='gray')
  1. plt.title("Unsharp Mask")
  1. plt.axis('off')
19.
  1. plt.subplot(1, 3, 3)
  1. plt.imshow(sharpened_unsharp, cmap='gray')
  1. plt.title("Sharpened Image (Unsharp Mask)")
  1. plt.axis('off')
24.
  1. plt.show()
AI代码解释python运行
#### **说明** - `cv2.GaussianBlur` 对图像进行模糊处理。 - 反锐化掩模公式:`sharpened = original + k * (original - blurred)`,其中 `k` 控制锐化强度。 --- ### **4\. 自定义锐化核(Custom Sharpening Kernel)** 可以通过自定义卷积核实现锐化,例如:
  1. [ 0, -1, 0]
  1. [-1, 5, -1]
  1. [ 0, -1, 0]
AI代码解释
#### **代码实现**
  1. # 自定义锐化核
  1. kernel = np.array([[0, -1, 0],
  1. [-1, 5, -1],
  1. [0, -1, 0]])
5.
  1. # 应用卷积
  1. sharpened_custom = cv2.filter2D(srcImg, -1, kernel)
8.
  1. # 显示结果
  1. plt.figure(figsize=(10, 5))
  1. plt.subplot(1, 2, 1)
  1. plt.imshow(srcImg, cmap='gray')
  1. plt.title("Original Image")
  1. plt.axis('off')
15.
  1. plt.subplot(1, 2, 2)
  1. plt.imshow(sharpened_custom, cmap='gray')
  1. plt.title("Sharpened Image (Custom Kernel)")
  1. plt.axis('off')
20.
  1. plt.show()
AI代码解释python运行
#### **说明** - `cv2.filter2D` 应用自定义卷积核。 - 核的中心值较大(如 `5`),周围为负值(如 `-1`),以增强边缘。 | 方法 | 特点 | | --- | --- | | **拉普拉斯锐化** | 二阶微分,适合突出细节,但对噪声敏感。 | | **Sobel 锐化** | 一阶微分,适合检测边缘,锐化效果较柔和。 | | **反锐化掩模** | 通过模糊图像提取高频信息,锐化效果自然。 | | **自定义锐化核** | 灵活调整核参数,适合特定场景。 | 你可以根据需求选择合适的方法,并通过调整参数(如锐化强度、核大小)优化效果。 ### 小结: 本文介绍了图像滤波的基础概念、典型噪声类型和常用滤波技术。图像滤波通过修改 频谱 来改变图像特性,分为去噪(抑制高频)和锐化(增强高频)两种核心作用。文章详细分析了椒盐噪声和高斯噪声的特征及成因,并提供了Python实现代码。在滤波方法上,重点讲解了线性滤波器(均值、高斯滤波)和非线性滤波器(中值、双边滤波)的原理及应用场景,通过代码演示了它们在图像处理中的实际效果。最后,文章介绍了四种图像锐化技术(拉普拉斯、Sobel、反锐化掩模和自定义核),对比了各自特点和使用方法,为图像处理任务提供了全面的技术参考。

评论加载中…