EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

FilterMedian

计算源向量中元素的中值。

中值滤波器是一种使用掩码(mask)的非线性排序滤波器,使用相邻区间内的中值来替换源向量中的元素。中值滤波器常用于图像和信号的处理中,具有滤除脉冲噪声的作用。通常掩码长度被设为奇数,奇数长度的掩码可以使计算实现更简洁,同时保证输出信号偏移较小。HMPP函数库还实现了延迟线的特性,计算时在源向量左端补充延迟线dlySrc数组数据,dlySrc为NULL时补充maskSize-1个src[0]。

函数接口声明如下:

  • 初始化操作

    HmppResult HMPPS_FilterMedianInit(int32_t maskSize, HmppDataType dataType, uint8_t **buffer);

  • 主函数操作:

    HmppResult HMPPS_FilterMedian_8u(const uint8_t *src, uint8_t *dst, int32_t len, int32_t maskSize, const uint8_t *dlySrc, uint8_t *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_16s(const int16_t *src, int16_t *dst, int32_t len, int32_t maskSize, const int16_t *dlySrc, int16_t *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_32s(const int32_t *src, int32_t *dst, int32_t len, int32_t maskSize, const int32_t *dlySrc, int32_t *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_32f(const float *src, float *dst, int32_t len, int32_t maskSize, const float *dlySrc, float *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_64f(const double *src, double *dst, int32_t len, int32_t maskSize, const double *dlySrc, double *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_8u_I(uint8_t *srcDst, int32_t len, int32_t maskSize, const uint8_t *dlySrc, uint8_t *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_16s_I(int16_t *srcDst, int32_t len, int32_t maskSize, const int16_t *dlySrc, int16_t *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_32s_I(int32_t *srcDst, int32_t len, int32_t maskSize, const int32_t *dlySrc, int32_t *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_32f_I(float *srcDst, int32_t len, int32_t maskSize, const float *dlySrc, float *dlyDst, uint8_t *buffer);

    HmppResult HMPPS_FilterMedian_64f_I(double *srcDst, int32_t len, int32_t maskSize, const double *dlySrc, double *dlyDst, uint8_t *buffer);

  • 释放内存操作:

    HmppResult HMPPS_FilterMedianRelease(uint8_t *buffer);

参数

参数名

描述

取值范围

输入/输出

srcDst

指向原址操作向量的指针。

非空

输入/输出

src

指向源向量的指针。

非空

输入

dst

指向目的向量的指针。

非空

输出

len

向量长度。

(0, INT_MAX]

输入

maskSize

中值掩码大小,若为偶数则减1后作为奇数用于中值滤波。

(0, len]

输入

dlySrc

源延迟线数据地址。

输入

dlyDst

目的延迟线数据地址。

输出

buffer

工作缓冲区地址。

非空

输入

bufferSize

工作缓冲区大小。

非空

输出

dataType

中值滤波支持的数据类型: 8u,16s,32s,32f,64f。

非空

输入

返回值

  • 成功:返回HMPP_STS_NO_ERR
  • 警告:返回HMPP_STS_EVEN_MEDIAN_MASK_SIZE。
  • 失败:返回错误码。

错误码

错误码

描述

HMPP_STS_NULL_PTR_ERR

srcDst、src、dst、buffer这几个入参中存在空指针。

HMPP_STS_SIZE_ERR

len小于或等于0。

HMPP_STS_MASK_SIZE_ERR

中值掩码小于或等于0或者大于len。

HMPP_STS_EVEN_MEDIAN_MASK_SIZE

告警,中值掩码为偶数。

注意

掩码长度通常是奇数,用户可以将其设为偶数,但最终会通过减法将其转变为奇数。

示例

#define DATA_SIZE 10
#define MASK_SIZE 3
void FilterMedianExample(void)
{

    int16_t src[DATA_SIZE] = { 1, 3, 3, 1, 5, 6, 3, 8, 19, 10 };
    int16_t dst[DATA_SIZE] = { 0 };
    uint8_t *buffer = NULL;
    int16_t dlySrc[MASK_SIZE-1] = { 2, 4 };
    int16_t dlyDst[MASK_SIZE-1] = { 0 };

    HmppResult retVal;
    retVal = HMPPS_FilterMedianInit(MASK_SIZE, HMPP16S, &buffer);
    if (retVal != HMPP_STS_EVEN_MEDIAN_MASK_SIZE && retVal != HMPP_STS_NO_ERR) {
        return;
    }
 
    retVal = HMPPS_FilterMedian_16s(src, dst, DATA_SIZE, MASK_SIZE, dlySrc, dlyDst, buffer);
    printf("result = %d\n", retVal);
    if (retVal != HMPP_STS_NO_ERR) {
        return;
    }
    HMPPS_FilterMedianRelease(buffer);
    int32_t i;
    printf("dst =");
    for (i = 0; i < DATA_SIZE; ++i) {
        printf(" %d", dst[i]);
    }
    printf("\ndlyDst =");
    for (i = 0; i < MASK_SIZE - 1; ++i) {
        printf(" %d", dlyDst[i]);
    }
    printf("\n");
}

运行结果:

result = 0
dst = 2 3 3 3 3 5 5 6 8 10
dlyDst = 19 10