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