1. 概述

3D降噪算法是将前后两帧的图像进行对比处理,找出噪点位置,然后对其增益控制。3D数字降噪功能能够降低弱信号图像的噪波干扰。


2. 函数接口

HI_S32 HI_MPI_VPSS_SetGrpParam(VPSS_GRP VpssGrp, VPSS_GRP_PARAM_S*pstVpssParam);

参数名称描述输入/输出
VpssGrpVPSS GROUP号输入
pstVpssParam高级属性设置输入

 VPSS_GRP_PARAM_S结构体:

typedef struct hiVPSS_GRP_PARAM_S
{
HI_U32 u32Contrast;                  //保留
HI_S32 s32GlobalStrength;            //3DNR降噪强度,[0.1408]
HI_S32 s32IeStrength;                //图像纹理增强,[-1,100]
HI_S32 s32YSFStrength;               //亮度空域去噪强度,[-1,100]
HI_S32 s32YTFStrength;               //亮度时域去噪强度,[-1,15]
HI_S32 s32CSFStrength;               //色度空域去噪强度,[-1,255]
HI_S32 s32CTFStrength;               //色域时域去噪强度,[-1,32]
HI_S32 s32MotionLimen;               //运动阈值,表示NR强度,[-1,32]
}VPSS_GRP_PARAM_S;

空域降噪是对单帧进行采样,降噪会牺牲更多的细节;时域降噪是对前后帧进行分析,尽量保留画面细节,但是拍摄剧烈运动可能会有拖影。在实际应用中可根据不同的侧重点(细节、运动、亮度、色度)来调整VPSS_GRP_PARAM_S结构体的成员变量。


3. PQTools设置界面

wKiom1idpfqTyMAPAABzG2glDlQ699.jpg


4. 代码设计

在SDK包的mpp/tools目录下编写应用程序代码,具体代码如下:

/* File Name: vpss_attr_3dnr.c
   Author:    shugen.yin
   Date:      2017.2.10
   Function:  3DNR setting
   log:
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hi_common.h"
#include "hi_comm_video.h"
#include "hi_comm_sys.h"
#include "hi_comm_vo.h"
#include "hi_comm_vi.h"
#include "hi_comm_vpss.h"
#include "hi_type.h"
#include "mpi_vb.h"
#include "mpi_sys.h"
#include "mpi_vi.h"
#include "mpi_vo.h"
#include "mpi_vpss.h"


#define CHECK_RET(express,name)\
    do{\
        if (HI_SUCCESS != express)\
        {\
            printf("%s failed at %s: LINE: %d ! errno:%#x \n", \
                   name, __FUNCTION__, __LINE__, express);\
            return HI_FAILURE;\
        }\
    }while(0)


HI_S32 main()
{
    HI_S32 s32Ret=0;
    HI_U8 u8Index = 0;
    VPSS_GRP VpssGrp = 0;
    VPSS_GRP_ATTR_S stVpssGrpAttr = {0};
    VPSS_GRP_PARAM_S stVpssGrpParam = {0};
	
   HI_S32 s32NrParam[4][8] = {	
	{0x0, 0x2f8, 0x0, 0x20, 0xc, 0x8, 0x6, 0x0},
	{0x0, 0x330, 0x0, 0x20, 0xc, 0x8, 0x6, 0x0},
	{0x0, 0x3ea, 0x0, 0x20, 0xc, 0x8, 0x6, 0x0},
	{0x0, 0x458, 0x0, 0x20, 0xc, 0xe, 0xc, 0x0}
    };
    
    s32Ret = HI_MPI_VPSS_GetGrpAttr(VpssGrp, &stVpssGrpAttr);
    CHECK_RET(s32Ret, "HI_MPI_VPSS_GetGrpAttr");
    s32Ret = HI_MPI_VPSS_GetGrpParam(VpssGrp, &stVpssGrpParam);
    CHECK_RET(s32Ret, "HI_MPI_VPSS_GetGrpParam");

	stVpssGrpAttr.bNrEn = 1;
	stVpssGrpParam.u32Contrast = s32NrParam[u8Index][0];
	stVpssGrpParam.s32GlobalStrength = s32NrParam[u8Index][1];
	stVpssGrpParam.s32IeStrength = s32NrParam[u8Index][2];
	stVpssGrpParam.s32YSFStrength = s32NrParam[u8Index][3];
	stVpssGrpParam.s32YTFStrength = s32NrParam[u8Index][4];
	stVpssGrpParam.s32CSFStrength = s32NrParam[u8Index][5];
	stVpssGrpParam.s32CTFStrength = s32NrParam[u8Index][6];
	stVpssGrpParam.s32MotionLimen = s32NrParam[u8Index][7];


    s32Ret = HI_MPI_VPSS_SetGrpAttr(VpssGrp, &stVpssGrpAttr);
	CHECK_RET(s32Ret, "HI_MPI_VPSS_SetGrpAttr");
    s32Ret = HI_MPI_VPSS_SetGrpParam(VpssGrp, &stVpssGrpParam);
    CHECK_RET(s32Ret, "HI_MPI_VPSS_SetGrpParam");
    return 0;
}


5. 编译运行

在mpp/tools目录下执行make命令,生成vpss_attr_3dnr可执行程序,将此可执行程序复制到目标板卡中,执行./vpss_attr_3dnr,3DNR算法模块开始工作。

wKioL1idp9OghuwZAABV43Ma6gw211.jpg


6. 最终结果

在没有运行vpss_attr_3dnr时,视频显示结果如下图所示,画面有明显的弱噪声。

wKiom1idqDfyGP4XAAIuqxmFpE4536.jpg

运行vpss_attr_3dnr后,视频显示结果如下图所示,弱噪声得到明显抑制。

wKioL1idqKuTDflcAAG9F9pBxF4044.jpg