---
title: FilterMedian
description: "计算源向量中元素的中值。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_hmpp_06_0126.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_hmpp_06_0126.html
indexId: 548483e3a74c342991b3af23f12a54e9094d89ce43a8bb8a223e5e644cf33e9b75
---
# 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
```
