做后台开发的同学一定遇到过这类需求:请假审批:员工提交 -> 主管审批 -> 部门经理审批 -> 副总审批,但不同天数的审批链路还不一样合同审批:金额超过 10 万需要额外部门会签,超过 50
2026/6/26 1:11:40
低通滤波允许图像中低频信息(大面积、平缓的像素变化,如主体轮廓)通过,抑制高频信息(小范围、剧烈的像素变化,如噪声、细节),最终实现:
卷积是“局部扫描+区域感知”的核心操作,步骤:
输入图像尺寸:H×W(高×宽),卷积核尺寸:k×k,步长s,填充p,则输出尺寸:
输出高 H' = ((H - k) + 2×p) // s + 1 输出宽 W' = ((W - k) + 2×p) // s + 1示例:输入640×480,核5×5,步长1,填充2(补0)→ 输出仍为640×480(无尺寸损失);步长2→输出320×240。
| 滤波类型 | ksize参数形式 | 原因 |
|---|---|---|
| 均值/高斯/方框 | 元组(如(5,3)) | 支持非正方形核(如5行3列),需明确高×宽 |
| 中值滤波 | 单个整数(如5) | 仅支持正方形核,简化参数避免冗余 |
import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图像(工程上优先处理灰度图) img = cv2.imread("test.jpg") # 彩色图:BGR格式 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度图(核心处理对象) # 图像显示辅助函数 def show_imgs(imgs, titles, rows=1, cols=2): plt.figure(figsize=(12, 6)) for i in range(len(imgs)): plt.subplot(rows, cols, i+1) plt.imshow(imgs[i], cmap="gray" if len(imgs[i].shape)==2 else None) plt.title(titles[i]) plt.axis("off") plt.show()线性滤波,卷积核内所有像素取算术平均值作为输出像素值,核内权重均等。
# 均值滤波:ksize=(5,5)(5×5核),步长默认1,填充默认适配核尺寸 blur_gray = cv2.blur(gray, ksize=(5,5)) show_imgs([gray, blur_gray], ["原图(灰度)", "均值滤波(5×5)"])均值滤波的“变种”,可选择是否对核内像素归一化(除以核面积):
# 归一化方框滤波(等价均值滤波) box_norm = cv2.boxFilter(gray, -1, (5,5), normalize=True) # 不归一化方框滤波(演示用,实际少用) box_unnorm = cv2.boxFilter(gray, -1, (5,5), normalize=False) show_imgs([gray, box_norm, box_unnorm//10], ["原图", "归一化方框滤波", "不归一化(缩放后)"])线性滤波,卷积核权重符合高斯分布(中心像素权重最高,向边缘递减),更贴合人眼视觉特性。
sigmaX(X方向标准差),sigmaY默认等于sigmaX(越大,滤波越平滑)。# 单次高斯滤波:(5,5)核,sigmaX=1.5 gauss1 = cv2.GaussianBlur(gray, (5,5), sigmaX=1.5) # 循环3次高斯滤波(工程常用,比单次大核更自然) gauss3 = gray.copy() for _ in range(3): gauss3 = cv2.GaussianBlur(gauss3, (5,5), sigmaX=1.5) show_imgs([gray, gauss1, gauss3], ["原图", "单次高斯滤波", "3次循环高斯滤波"])非线性滤波,取卷积核内所有像素的中值作为输出像素值,对“孤立噪声”(如椒盐噪声)效果极佳。
# 模拟添加椒盐噪声 np.random.seed(0) noise = np.random.choice([0, 255], size=gray.shape, p=[0.98, 0.02]) gray_noise = np.where(noise==255, 255, gray) # 加盐噪声 # 中值滤波去椒盐噪声 median = cv2.medianBlur(gray_noise, 5) # ksize=5(5×5核) show_imgs([gray, gray_noise, median], ["原图", "加椒盐噪声", "中值滤波(5×5)"])非线性滤波,兼顾空间距离和像素值相似度:
d(核直径)、sigmaColor(色彩标准差,越大,允许越宽的像素值范围)、sigmaSpace(空间标准差);# 双边滤波:d=9(核直径),sigmaColor=75,sigmaSpace=75 bilateral = cv2.bilateralFilter(gray, d=9, sigmaColor=75, sigmaSpace=75) # 对比:高斯滤波(边缘模糊)vs 双边滤波(边缘保留) gauss = cv2.GaussianBlur(gray, (9,9), sigmaX=5) show_imgs([gray, gauss, bilateral], ["原图", "高斯滤波(边缘模糊)", "双边滤波(保边缘)"])优先处理灰度图:
cv2.COLOR_BGR2GRAY),减少计算量;| 场景 | 首选滤波 | 补充说明 |
|---|---|---|
| 普通随机噪声 | 高斯滤波(循环) | 核5×5,循环2-3次 |
| 椒盐噪声/孤立亮点 | 中值滤波 | 核3×3/5×5,根据噪声大小调整 |
| 需保留边缘的去噪 | 双边滤波 | 牺牲速度换效果 |
| 快速简单去噪(无要求) | 均值滤波 | 仅临时测试/低要求场景 |
sigmaX建议1.0~3.0(过大会丢失关键细节);sigmaX=0时,OpenCV会自动按核尺寸计算(不推荐,显式指定更可控);低通滤波的核心是“trade-off(取舍)”:去噪越强,模糊越明显。工程上需结合业务场景(如监控图像去噪、证件照磨皮、工业检测去噪)选择滤波类型,优先用高斯/中值滤波,配合灰度图+小核循环的方式,既能保证效果,又能控制计算成本。