图像滤波
修改像素值,改变像素周围像素值:去噪、平滑、锐化
应用
* 去噪声
![](https://i-blog.csdnimg.cn/blog_migrate/52e8b804fde1d7a7600eb3a9af1ac873.png)
* 锐化、平滑
* 边缘检测
* 形态学处理:处理二值图像
* 图像重构:强化重点,弱化其他内容(语义上的去噪声)
分类
线性:通过将目标像素周围的像素进行加权平均或者求和,得到目标像素的灰度值。**卷积核**
* 均值滤波:
用每一个像素周围的像素的平均值代替自身
均值滤波与卷积
卷积
`cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst`
- src:输入图像
- ddepth:输出图像的深度,如果为-1,则输出图像的深度与输入图像一致。
- kernel:卷积核
- dst:输出图像
- anchor:卷积核中心的位置,默认值为(-1, -1),表示卷积核的中心点为卷积核的中心。
- delta:可选的增量,用于调整卷积的结果。
- borderType:边界填充方式,默认值为cv2.BORDER_DEFAULT。
import cv2
img = cv2.imread("../../dataset/noise_lena.png", 0)
h, w = img.shape
# 定义滤波核
kernel_size = 11
kernel = np.ones((kernel_size, kernel_size), dtype=np.float32)
# 方案一
# 添加pand
padding = kernel_size // 2
# 对图像进行填充,这里使用了复制边界的方式
img_pad = cv2.copyMakeBorder(img, padding, padding, padding, padding, cv2.BORDER_REPLICATE)
print(img_pad.shape, img.shape)
# 构建输出图像
img_out = np.zeros((h, w), dtype=np.uint8)
# 进行卷积操作
for i in range(padding, h+padding):
for j in range(padding, w+padding):
# 对于每个像素,取它周围kernel_size*kernel_size个像素的平均值,作为它的输出值
roi = img[i-padding:i+padding+1, j-padding:j+padding+1]
img_out[i-padding, j-padding] = np.mean(roi, axis=(0, 1))
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(img_out)
plt.show()
# 方案二
# 定义均值卷积核
kernel = np.ones((kernel_size, kernel_size), np.float32) / kernel_size**2
# 对图像进行卷积操作
img_out = cv2.filter2D(img, -1, kernel)
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(img_out)
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/3e38c0f3e1763985f23f9f2a77743eac.png)
![](https://i-blog.csdnimg.cn/blog_migrate/73781528d029f904f93bebf3b3d98482.jpeg)
* 中值滤波(非线性):
处理椒盐噪声(雪花点)和斑点
* 高斯滤波:
去除高斯噪声&#