上一篇文章讲的是: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 原始图像进行空间域平滑处理,目的是消除图像中高频噪声和虚假信号,同时尽量保留边缘信息。
原始图像分辨率有限,高频内容(如细线、格栅等)在采样时失真;
在 Bayer 模式下,高频伪影更严重,会影响 demosaic;
解决方式:在采样或处理前做低通滤波(Anti-Aliasing Filter,AA Filter)。
主要来自于传感器(热噪声、电路噪声)、环境光弱时的随机波动;
原始 Bayer 图中的噪声不仅影响清晰度,还会引入伪彩。
对图像做模糊处理,降低高频分量;
Gaussian 是均值滤波的加权版;
Bilateral(双边滤波)可以同时平滑图像又保留边缘。
用于保持边缘而去除背景噪声;
比如 Guided Filter、Non-Local Means、Kuwahara Filter;
适用于对图像细节要求高的高端 ISP。
抵抗椒盐噪声、单点突变等;
对于 dead pixel 或突发点状噪声较好。
代码实现:
def AAF(lsc_img, k):
"""
inputs:
lsc_img = bayer domain image after lens shading correcting
k = anti-aliasing correction factor to control strenght of anti-aliasing
outputs:
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 neighbors
p1 = padded_img[:-4:1, :-4:1] # create 9 different arrays for p0:p8
p2 = 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 filter
return 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
越小,越平均,图像越模糊。