目录
图像滤波基础概念
滤波的核心作用
典型图像噪声类型
椒盐噪声(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):
- 代码
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
- import cv2,skimage
- import numpy as np
- from matplotlib import pyplot as plt
- import seaborn as sns
- # 原图
- srcImg = cv2.imread("lenna.jpg",0)
- # 高斯核大小为5,标准差为1.0
- blurred_img = cv2.GaussianBlur(srcImg, (5, 5), sigmaX=1.0)
- plt.imshow(blurred_img, cmap='gray')
- plt.title("OpenCV Gaussian Blur")
- plt.axis('off')
- 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
- import cv2
- from matplotlib import pyplot as plt
- # 原图
- srcImg = cv2.imread("lenna.jpg",0)
- # 5:滤波器的直径(邻域大小
- # 100:颜色空间的标准差(控制颜色相似性)
- # 100:坐标空间的标准差(控制空间相似性
- blurred_img = cv2.bilateralFilter(srcImg, 5, 100, 100)
- plt.imshow(blurred_img, cmap='gray')
- plt.title("OpenCV Bilateral Filter")
- plt.axis('off')
- plt.show()AI代码解释python运行
--- ## 图像锐化( Image Sharpening)是一种增强图像边缘和细节的技术,通常通过高通滤波器(如拉普拉斯算子、Sobel算子等)或反锐化掩模(Unsharp Masking)实现。以下是几种常见的图像锐化方法及其实现代码。 --- ### **1\. 拉普拉斯锐化(Laplacian Sharpening)** 拉普拉斯算子是一种二阶微分算子,可以突出图像中的边缘和细节。 #### **代码实现**
- import cv2
- import numpy as np
- from matplotlib import pyplot as plt
4.
- # 读取图像(灰度模式)
- srcImg = cv2.imread("lenna.jpg", 0)
- if srcImg is None:
- raise ValueError("Image not found or unable to load.")
9.
- # 拉普拉斯算子
- laplacian = cv2.Laplacian(srcImg, cv2.CV_64F)
12.
- # 锐化图像(原图 + 拉普拉斯结果)
- sharpened = srcImg - 0.5 * laplacian # 系数可调整
15.
- # 显示结果
- plt.figure(figsize=(15, 5))
- plt.subplot(1, 3, 1)
- plt.imshow(srcImg, cmap='gray')
- plt.title("Original Image")
- plt.axis('off')
22.
- plt.subplot(1, 3, 2)
- plt.imshow(laplacian, cmap='gray')
- plt.title("Laplacian Filter")
- plt.axis('off')
27.
- plt.subplot(1, 3, 3)
- plt.imshow(sharpened, cmap='gray')
- plt.title("Sharpened Image")
- plt.axis('off')
32.
- plt.show()
AI代码解释python运行
#### **说明** - `cv2.Laplacian` 计算图像的拉普拉斯结果。 - 锐化公式:`sharpened = original + k * laplacian`,其中 `k` 是锐化强度(通常为负数,如 `-0.5`)。 --- ### **2\. Sobel 锐化(Sobel Sharpening)** Sobel 算子是一种一阶微分算子,可以检测水平和垂直方向的边缘。 #### **代码实现**
- # Sobel 算子(水平和垂直方向)
- sobel_x = cv2.Sobel(srcImg, cv2.CV_64F, 1, 0, ksize=3)
- sobel_y = cv2.Sobel(srcImg, cv2.CV_64F, 0, 1, ksize=3)
4.
- # 合并 Sobel 结果
- sobel = np.sqrt(sobel_x2 + sobel_y2)
7.
- # 锐化图像
- sharpened_sobel = srcImg + 0.1 * sobel # 系数可调整
10.
- # 显示结果
- plt.figure(figsize=(15, 5))
- plt.subplot(1, 3, 1)
- plt.imshow(srcImg, cmap='gray')
- plt.title("Original Image")
- plt.axis('off')
17.
- plt.subplot(1, 3, 2)
- plt.imshow(sobel, cmap='gray')
- plt.title("Sobel Filter")
- plt.axis('off')
22.
- plt.subplot(1, 3, 3)
- plt.imshow(sharpened_sobel, cmap='gray')
- plt.title("Sharpened Image (Sobel)")
- plt.axis('off')
27.
- plt.show()
AI代码解释python运行
#### **说明** - `cv2.Sobel` 分别计算水平和垂直方向的梯度。 - 锐化公式:`sharpened = original + k * sobel`,其中 `k` 控制锐化强度。 --- ### **3\. 反锐化掩模(Unsharp Masking)** 反锐化掩模通过从原图中减去模糊后的图像来增强边缘。 #### **代码实现**
- # 高斯模糊
- blurred = cv2.GaussianBlur(srcImg, (5, 5), 0)
3.
- # 反锐化掩模
- unsharp_mask = srcImg - blurred
- sharpened_unsharp = srcImg + 0.5 * unsharp_mask # 系数可调整
7.
- # 显示结果
- plt.figure(figsize=(15, 5))
- plt.subplot(1, 3, 1)
- plt.imshow(srcImg, cmap='gray')
- plt.title("Original Image")
- plt.axis('off')
14.
- plt.subplot(1, 3, 2)
- plt.imshow(unsharp_mask, cmap='gray')
- plt.title("Unsharp Mask")
- plt.axis('off')
19.
- plt.subplot(1, 3, 3)
- plt.imshow(sharpened_unsharp, cmap='gray')
- plt.title("Sharpened Image (Unsharp Mask)")
- plt.axis('off')
24.
- plt.show()
AI代码解释python运行
#### **说明** - `cv2.GaussianBlur` 对图像进行模糊处理。 - 反锐化掩模公式:`sharpened = original + k * (original - blurred)`,其中 `k` 控制锐化强度。 --- ### **4\. 自定义锐化核(Custom Sharpening Kernel)** 可以通过自定义卷积核实现锐化,例如:
- [ 0, -1, 0]
- [-1, 5, -1]
- [ 0, -1, 0]
AI代码解释
#### **代码实现**
- # 自定义锐化核
- kernel = np.array([[0, -1, 0],
- [-1, 5, -1],
- [0, -1, 0]])
5.
- # 应用卷积
- sharpened_custom = cv2.filter2D(srcImg, -1, kernel)
8.
- # 显示结果
- plt.figure(figsize=(10, 5))
- plt.subplot(1, 2, 1)
- plt.imshow(srcImg, cmap='gray')
- plt.title("Original Image")
- plt.axis('off')
15.
- plt.subplot(1, 2, 2)
- plt.imshow(sharpened_custom, cmap='gray')
- plt.title("Sharpened Image (Custom Kernel)")
- plt.axis('off')
20.
- plt.show()
AI代码解释python运行
#### **说明** - `cv2.filter2D` 应用自定义卷积核。 - 核的中心值较大(如 `5`),周围为负值(如 `-1`),以增强边缘。 | 方法 | 特点 | | --- | --- | | **拉普拉斯锐化** | 二阶微分,适合突出细节,但对噪声敏感。 | | **Sobel 锐化** | 一阶微分,适合检测边缘,锐化效果较柔和。 | | **反锐化掩模** | 通过模糊图像提取高频信息,锐化效果自然。 | | **自定义锐化核** | 灵活调整核参数,适合特定场景。 | 你可以根据需求选择合适的方法,并通过调整参数(如锐化强度、核大小)优化效果。 ### 小结: 本文介绍了图像滤波的基础概念、典型噪声类型和常用滤波技术。图像滤波通过修改 频谱 来改变图像特性,分为去噪(抑制高频)和锐化(增强高频)两种核心作用。文章详细分析了椒盐噪声和高斯噪声的特征及成因,并提供了Python实现代码。在滤波方法上,重点讲解了线性滤波器(均值、高斯滤波)和非线性滤波器(中值、双边滤波)的原理及应用场景,通过代码演示了它们在图像处理中的实际效果。最后,文章介绍了四种图像锐化技术(拉普拉斯、Sobel、反锐化掩模和自定义核),对比了各自特点和使用方法,为图像处理任务提供了全面的技术参考。
评论加载中…