ISP Pipeline(4): Anti Aliasing Noise Filter 抗锯齿与降噪滤波器
上一篇文章讲的是:ISP Pipeline(3):Lens Shading Correction 镜头阴影校正-CSDN博客
视频:(5) Anti Aliasing Noise Filter | Image Signal Processing Pipeline Tutorial Series
源码:ISP Pipeline(3):Lens Shading Correction 镜头阴影校正-CSDN博客
Anti-Aliasing Noise Filter 是在图像进入后续 ISP 流程之前,对 Bayer 原始图像进行空间域平滑处理,目的是消除图像中高频噪声和虚假信号,同时尽量保留边缘信息。
1. Aliasing 锯齿产生的原因
-
原始图像分辨率有限,高频内容(如细线、格栅等)在采样时失真;
-
在 Bayer 模式下,高频伪影更严重,会影响 demosaic;
-
解决方式:在采样或处理前做低通滤波(Anti-Aliasing Filter,AA Filter)。
2. Noise 噪声的来源
-
主要来自于传感器(热噪声、电路噪声)、环境光弱时的随机波动;
-
原始 Bayer 图中的噪声不仅影响清晰度,还会引入伪彩。
滤波器实现方式(常见)
1. Gaussian Blur / Bilateral Filter
-
对图像做模糊处理,降低高频分量;
-
Gaussian 是均值滤波的加权版;
-
Bilateral(双边滤波)可以同时平滑图像又保留边缘。
2. Edge-Preserving Filter
-
用于保持边缘而去除背景噪声;
-
比如 Guided Filter、Non-Local Means、Kuwahara Filter;
-
适用于对图像细节要求高的高端 ISP。
3. Median Filter(中值滤波)
-
抵抗椒盐噪声、单点突变等;
-
对于 dead pixel 或突发点状噪声较好。
代码实现:
def AAF(lsc_img, k):"""inputs:lsc_img = bayer domain image after lens shading correctingk = anti-aliasing correction factor to control strenght of anti-aliasingoutputs:aaf_img = bayer domain image after applying anti-aliasing"""padded_img = np.pad(lsc_img, (2,2), 'reflect') # pad the image to give corner pixels full set of neighborsp1 = padded_img[:-4:1, :-4:1] # create 9 different arrays for p0:p8p2 = padded_img[:-4:1, 2:-2:1]p3 = padded_img[:-4:1, 4::1]p4 = padded_img[2:-2:1, :-4:1]p0 = padded_img[2:-2:1, 2:-2:1] * (k**0.5)p5 = padded_img[2:-2:1, 4::1]p6 = padded_img[4::1, :-4:1]p7 = padded_img[4::1, 2:-2:1]p8 = padded_img[4::1, 4::1]neighbors = np.array([p1, p2, p3, p4, p0, p5, p6, p7, p8]) / ((k + 8)**0.5)aaf_img = (np.sum(neighbors, axis = 0)).astype(np.uint16) # apply the filterreturn aaf_img
自定义 Anti-Aliasing Filter(抗锯齿滤波器),对中心像素及其周围 8 个邻居加权平均,达到 降噪和平滑高频伪影 的目的。
提取邻域:
p1 p2 p3
p4 p0 p5
p6 p7 p8
其中中心像素是:
p0 = padded_img[2:-2, 2:-2] * (k**0.5)
其余 8 个邻居不乘 k 权重,而是在后续归一化除以 sqrt(k + 8)
。
权重逻辑:
其中 k
越大,越强调中心像素,越接近原图(平滑度下降);
k
越小,越平均,图像越模糊。