ISP

ISP算子用于将富含原始图像数据的RAW图像转换为视频处理中应用更为广泛的YUV图像。

算子效果

输入图像参数输出图像
imagebufNum = 3
bufCached = 0
backend = HB_UCP_ISP_CORE_0
width = 1920
height = 1080
image

原理

在ISP对RAW图像的处理过程中,包括但不限于以下子模块:

  • BLC (Black Level Correction) 黑电平矫正:sensor的电路本身存在暗电流,导致在没有光线照射的时候,像素单位也有一定的输出电压。BLC通过调整图像传感器输出中的黑电平偏移,使得图像暗部区域更加真实地反应场景的亮度。

  • LSC (Lens Shading Correction) 镜头阴影校正:在实际图像捕捉过程中,由于镜头对于光的折射不均匀会导致镜头周围出现阴影。LSC对图像亮度和颜色进行校正,在实际图像处理过程中,测量镜头的光线衰减特性,生成一个校正模型并将其应用于图像的每个像素,通过提高边缘像素的亮度以及调整颜色通道的强度,使图像亮度和颜色分布更加均匀。

  • DPC (Defect Pixel Correction) 坏点校正:由于sensor中的传感器感光阵列工艺存在缺陷,或光信号进行转化的过程中出现错误,导致图像中像素值不准确。DPC通常通过临近插值法、模式匹配法使坏点与周围正常像素一致。

  • 2DNR/3DNR (2D/3D Noise Reduce) 2D/3D降噪:图像噪声通常是信号在采集、传输及记录过程中,受到成像设备自身因素和外界环境的影响而产生的。ISP中包含了2D和3D降噪模块,分别对单帧图像进行空间降噪,同时使用时间域滤波技术减少时域噪声。

  • Demosaic: CFA插值:将单色图像传感器(如拜耳滤波器阵列)捕获的原始像素数据转换为全彩色图像。大多数数字相机和图像传感器都使用拜耳滤波器,它将传感器的像素分成红、绿、蓝三个颜色通道。Demosaicing 的过程就是从这些单色采样数据中恢复出完整的 RGB 彩色图像。

  • CSC (Color space conversion) 颜色空间转换:CSC模块将图像数据格式由RGB转换成YUV。颜色空间转换通常通过矩阵变换或非线性变换来实现。

API接口

int32_t hbVPCreateISPContext(hbVPISPContext *context,
                             hbVPISPCtxParam const *ispCtxParam);

int32_t hbVPISP(hbUCPTaskHandle_t *taskHandle, 
                hbVPImage const *srcImg,
                hbVPISPContext context);

int32_t hbVPGetISPOutputBuffer(hbVPImage *outImg, 
                               hbUCPTaskHandle_t handle);

int32_t hbVPReleaseISPContext(hbVPISPContext context);

详细接口信息请查看 hbVPISP

使用方法

// include the header
#include "hobot/hb_ucp.h"
#include "hobot/vp/hb_vp.h"
#include "hobot/vp/hb_vp_isp.h"

// init Image, allocate memory for image data
hbUCPSysMem src_mem;
int32_t src_width = 1920;
int32_t src_height = 1080;
int32_t raw_size{src_width * src_height * 3 / 2};
hbUCPMalloc(&src_mem, raw_size, 0);

hbVPImage src_img{HB_VP_IMAGE_FORMAT_Y,
                  HB_VP_IMAGE_TYPE_U12C1,
                  src_width,
                  src_height,
                  0,
                  src_mem.virAddr,
                  src_mem.phyAddr,
                  0,
                  0,
                  0};

int32_t dst_width{src_width};
int32_t dst_height{src_height};

hbVPImage dst_img;

// init isp config
hbVPISPCtxParam isp_ctx_param = {3, 0, HB_UCP_ISP_CORE_0,
                                  dst_width, dst_height};

// init task handle, schedule param and isp context
hbUCPTaskHandle_t task_handle{nullptr};
hbVPISPContext isp_ctx{nullptr};
hbUCPSchedParam sched_param;
sched_param.backend = HB_UCP_ISP_CORE_0;
sched_param.priority = 0;

// create isp context
hbVPCreateISPContext(&isp_ctx, &isp_ctx_param);

// create task
hbVPISP(&task_handle, &src_img, isp_ctx);

// submit task
hbUCPSubmitTask(task_handle, &sched_param);

// wait for task done 
hbUCPWaitTaskDone(task_handle, 0);

// get output buffer
hbVPGetISPOutputBuffer(&dst_img, task_handle);

// release task handle
hbUCPReleaseTask(task_handle);

// release isp context
hbVPReleaseISPContext(isp_ctx);

// release memory
hbUCPFree(&src_mem);