5.16. ISP - AF统计模块功能

5.16.1. 功能描述

自动对焦通过分析图像对比度,自动调整相机镜头达到对焦目标。自动对焦算法统计信息由ISP中的AFM模块提供,AFM模块通过内置滤波器对RAW数据进行卷积计算得到图像清晰值FV(Focus Value),AFM模块统计位置位于RAW域最后。

AFM模块包含FIR和IIR的低通滤波器,FIR高通滤波结果与IIR高通滤波结果融合,低通滤波结果通滤波结果融合,最终输出高通低通两组统计数据。统计区域固定数量的15x15,总统计区域大小可以配置。

5.16.2. 通路介绍

 Block

5.16.3. AFM统计模块接口

AFM统计数据获取接口

int32_t hbn_isp_get_af_statistics(hbn_vnode_handle_t vnode_fd, hbn_isp_af_statistics_t *p_data);

typedef struct hbn_isp_af_statistics_s {
        uint32_t sharpnessLowPass[HBN_ISP_AFM_BLOCK_NUM];
        uint32_t sharpnessHighPass[HBN_ISP_AFM_BLOCK_NUM];
        uint32_t histLowData[HBN_ISP_AFM_BLOCK_NUM];
        uint32_t histHighData[HBN_ISP_AFM_BLOCK_NUM];
        uint32_t frame_id;      // 当前对应frame id(备用)
} hbn_isp_af_statistics_t;

AFM统计模块参数接口

int32_t hbn_isp_get_afm_attr(hbn_vnode_handle_t vnode_fd, hbn_isp_afm_attr_t *p_attr);
int32_t hbn_isp_set_afm_attr(hbn_vnode_handle_t vnode_fd, hbn_isp_afm_attr_t *p_attr);

typedef struct hbn_isp_afm_ldg_s {
	float iir_highpass_y[HBN_ISP_AFM_LDG_Y_NUM];	/**< IIR high pass on Y axis */
	uint8_t iir_highpass_x[HBN_ISP_AFM_LDG_X_NUM];	/**< IIR high pass on X axis */
	float iir_lowpass_y[HBN_ISP_AFM_LDG_Y_NUM];	/**< IIR low pass on Y axis */
	uint8_t iir_lowpass_x[HBN_ISP_AFM_LDG_X_NUM];	/**< IIR low pass on X axis */
	float fir_highpass_y[HBN_ISP_AFM_LDG_Y_NUM];	/**< FIR high pass on Y axis */
	uint8_t fir_highpass_x[HBN_ISP_AFM_LDG_X_NUM];	/**< FIR high pass on X axis */
	float fir_lowpass_y[HBN_ISP_AFM_LDG_Y_NUM];	/**< FIR low pass on Y axis */
	uint8_t fir_lowpass_x[HBN_ISP_AFM_LDG_X_NUM];	/**< FIR low pass on X axis */
} hbn_isp_afm_ldg_t;

typedef struct hbn_isp_afm_coring_s {
	uint8_t iir_highpass[HBN_ISP_AFM_CORING_COEFF_NUM];	/**< IIR high pass */
	uint8_t iir_lowpass[HBN_ISP_AFM_CORING_COEFF_NUM];	/**< IIR low pass */
	uint8_t fir_highpass[HBN_ISP_AFM_CORING_COEFF_NUM];	/**< FIR high pass */
	uint8_t fir_lowpass[HBN_ISP_AFM_CORING_COEFF_NUM];	/**< FIR low pass */
} hbn_isp_afm_coring_t;

typedef struct hbn_isp_afm_iir_s {
	uint8_t data_shift;	/**< Data shift */
	uint8_t data_shift_v;	/**< Data shift Vetical*/
	float highpass_weight;	/**< High pass weight */
	float lowpass_weight;	/**< Low pass weight */
	float highpass_coeff[HBN_ISP_AFM_IIR_FILTER_NUM][HBN_ISP_AFM_IIR_FILTER_COEFF_NUM];  /**< High pass coefficient */
	float lowpass_coeff[HBN_ISP_AFM_IIR_FILTER_NUM][HBN_ISP_AFM_IIR_FILTER_COEFF_NUM];   /**< Low pass coefficient */
} hbn_isp_afm_iir_t;

typedef struct hbn_isp_afm_fir_s {
	uint8_t data_shift;		/**< Data shift */
	uint8_t data_shift_v;		/**< Data shift Vetical*/
	float highpass_weight;		/**< High pass weight */
	float lowpass_weight;		/**< Low pass weight */
	uint8_t highdata_shift;
	uint8_t highdata_shift_v;
	uint8_t lowdata_shift;
	uint8_t lowdata_shift_v;
	uint8_t highpass_coeff[HBN_ISP_AFM_FIR_HIGHPASS_COEFF_NUM];	/**< High pass coefficient */
	uint8_t lowpass_coeff[HBN_ISP_AFM_FIR_LOWPASS_COEFF_NUM];	/**< Low pass coefficient */
} hbn_isp_afm_fir_t;

typedef struct hbn_isp_afm_attr_s {
	uint16_t bls;					/**< BLS components */
	uint8_t hist_threshold;				/**< Histogram threshold */
	float gamma;					/**< Gamma value */
	uint16_t hw_roi[HBN_ISP_AFM_BLOCK_POINT_NUM];	/**< Hardware ROI */
	hbn_isp_afm_ldg_t ldg;				/**< Level Dependent Gain configuration */
	hbn_isp_afm_coring_t coring;			/**< Coring configuration */
	hbn_isp_afm_iir_t iir;				/**< IIR configuration */
	hbn_isp_afm_fir_t fir;				/**< FIR configuration */
} hbn_isp_afm_attr_t;

5.16.4. 输入图像裁剪

AFM模块支持输入图像统计位置配置结构hbn_isp_afm_attr_thw_roi参数配置,四个结构成员分别对应xy的起始位置最终位置。

5.16.5. 输入图像预处理

AFM模块进行滤波器计算之前包含BLC和Gamma两步预处理,可以配置参数去除一定电平,Gamma参数需要配置一个Gamma系数,软件自动计算对应的Gamma曲线配置硬件。

两个参数分别对应结构hbn_isp_afm_attr_tblsgamma参数。

5.16.6. 输出数据后处理

AFM模块进行滤波器计算之后包含Coring和LDG两步后处理。这两个参数分别对应结构hbn_isp_afm_attr_tcoringldg参数。

coring功能低光区域消除噪音增加清晰度。低于某一阈值像素根据coring曲线切割。 第一个参数x1,如果输入x < x1,则y = 0。第二个参数x2,如果 x1 < x < x2,则 y = ( x - x1) * x2 / 16。第三个参数x3,直线映射阶段斜率。 默认参数如下,代表32到230区间映射斜率为1。

 Block

电平依赖增益(LDG)根据像素调节清晰度。它根据LDG曲线增加像素值,减少高像素值。LDG是在IIR滤波器和FIR滤波器之后进行的。 以高通IIR滤波为例,iirHighPassY[0~2]:高通IIR滤波的LDG curve的Y轴,代表针对输入x的放大倍数,即1.0为 y = x * 1,2.0为 y = 2 * x。iirHighPassX[0~3]:高通IIR滤波的LDG curve的x轴,分别对应图中的x[0~3],代表判定输入x在数值判定范围,根据不同范围决定映射放大斜率。

 Block

5.16.7. 数据融合

AF的统计数据包含highdata与lowdata,分别代表FIR和IIR高通滤波结果加权结果与FIR和IIR低通滤波结果加权结果。

highdata = (fir.highdata * fir.highpassweight + iir.highdata * iir.highpassweight) / 2;
lowdata = (fir.lowdata * fir.lowpassweight + iir.lowdata * iir.lowpassweight) / 2;

iir与fir的highpassweight建议等于2,iir与fir的lowpassweight建议等于2,这样不会数据额外倍数引入。

5.16.8. 点光源处理

场景出现点光源时,受到光晕影响统计数据出现图像模糊越大反常现象,对于这种情况,AFM有亮度统计模块,可以帮助用户一些调试策略。配置亮度阈值,可以获取超过或者低于阈值像素个数,用户可以依据判断区域是否是一个光源,然后选择剔除区域数据,或者通过亮点个数变化判断区域对焦或者失焦。

亮度阈值结构hbn_isp_afm_attr_thist_threshold参数。

5.16.9. 数据移位

参数 含义
fir.highDataShift/fir.lowDataShift 每个像素点,在fir滤波器水平梯度平方之前位移
fir.lowDataShiftV/fir.highDataShiftV 每个像素点,在fir滤波器垂直梯度平方之前位移
fir.data_shift/iir.data_shift 每个block统计时候,block中一行的sharpness加起来位移数。高通低通这个参数
fir.data_shift_v/iir.data_shift_v 每个block统计时候,所有点加起来位移数。高通低通这个参数

5.16.10. IIR参数生成步骤参考

接口选用比雪夫 II 型滤波器,第一个参数为3阶,最后一个参数带通”bandpass” ,这两个参数不可改变的。 然后利用tf2sos分解成2阶。得出参数与json中参数对应关系如下:

  1. a2的三个参数对应json第一列三个参数,b3的第二个参数对应json中第一列第四个参数。

  2. a3的三个参数对应json第二列三个参数,b2的第二个参数对应json中第二列第四个参数。

  3. a1的三个参数对应json第三列三个参数,b1的第二个参数对应json中第三列第四个参数。

 matlab_iir

5.16.11. 推荐参数配置

"AFM_3": {
	"bls": 0,
	"coring": {
		"firHighPass": [32,230,16],
		"firLowPass": [32,230,16],
		"iirHighPass": [32,230,16],
		"iirLowPass": [32,230,16]
	},
	"fir": {
		"dataShift": 12,
		"dataShiftV": 3,
		"highPassWeight": 1.0,
		"lowPassWeight": 1.0,
		"highDataShift": 0,
		"highDataShiftV": 0,
		"lowDataShift": 3,
		"lowDataShiftV": 3,
		"highPassCoeff": [2, 1],
		"lowPassCoeff": [12, 6, 4, 3]
	},
	"gamma": 2.2,
	"histThreshold": 128,
	"hwRoi": [0,0,1920,1080],
	"iir": {
		"dataShift": 3,
		"dataShiftV": 3,
		"highPassWeight": 1.0,
		"highPassCoeff": [[0.573, -1.4474, 0.774, -1.98],[0.573, -1.875, 0.915, -1.31],[0.217, -1.467, 0.566, 0.0]],
		"lowPassWeight": 1.0,
		"lowPassCoeff": [[0.6, -0.445, 0.624, -1.92],[0.6, -1.67, 0.823, 0.215],[0.383, -1.465, 0.566, 0.0]]
	},
	"ldg": {
		"firHighPassX": [16, 96, 160, 208],
		"firHighPassY": [4.0, 8.0, 4.0],
		"firLowPassX": [16, 96, 160, 208],
		"firLowPassY": [4.0, 8.0, 4.0],
		"iirHighPassX": [16, 96, 160, 208],
		"iirHighPassY": [1.0, 2.0, 1.0],
		"iirLowPassX": [16, 96, 160, 208],
		"iirLowPassY": [1.0, 2.0, 1.0]
	},
}

5.16.12. 调试建议

  1. coring参数用于去除噪声影响,在曝光增益场景,可以适当增加coring的第一个参数,能够减弱噪声导致数值波动,但整体FV值会后下降。

  2. 高对比度场景如果出现波峰曲线,这可能垂直方向滤波数据过大导致的,可以调整fir的滤波参数,适当减少垂直方向参数,来减少垂直方向对比度影响。

  3. 信息不足场景,经过AFM输出统计数据通常小,可以适当减少各级datashift,适当增加ldg中间区域数值增大最终统计数据,不建议参数调整偏离过大,会影响普通场景统计数据结果。