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