FilterBorder
将均值滤波器应用于源图像并将结果存储到目标图像。这里处理的图像是三维图像。边框像素的值根据边框类型和边框值赋值参数获得。
本函数使用的滤波核是由HMPPI_CreateKernel3D_32f来进行初始化,同时,此函数所需应用到的pSpec空间大小计算需要先使用HMPPI_FilterBorderGetSize来申请,并在HMPPI_FilterBorderInit_32f中进行初始化包括创建好的滤波核。
函数接口声明如下:
- 辅助函数:
HmppResult HMPPI_CreateKernel3D_32f(float* kernel, HmpprVolume kernelSize);
HmppResult HMPPI_FilterBorderGetSize(HmpprVolume kernelVolume, HmpprVolume dstRoiVolume, int numChannels, int* pSpecSize);
HmppResult HMPPI_FilterBorderInit_32f(const float* pKernel, HmpprVolume kernelVolume, int numChannels, HmpprFilterBorderSpec* pSpec);
- 主函数:
HmppResult HMPPI_FilterBorder_32f_C1V(const float* pSrc, int srcPlaneStep, int srcStep, float* pDst, int dstPlaneStep, int dstStep, HmpprVolume dstRoiVolume, HmpprBorderType borderType, const float borderValue[1], const HmpprFilterBorderSpec* pSpec);
- 释放函数:
HmppResult HMPPI_FilterBorderRelease_32f(HmpprFilterBorderSpec *pSpec);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
|---|---|---|---|
pSrc |
指向源体积起点的指针。 |
非空 |
输入 |
srcStep |
源体积中每个平面连续行起始点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
srcPlaneStep |
源连续体积平面之间的距离(以字节为单位)。 |
非负整数 |
输入 |
pDst |
指向目标体积原点的指针。 |
非空 |
输入/输出 |
dstStep |
目标体积中每个平面连续行起始点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
dstPlaneStep |
目标连续体积平面之间的距离(以字节为单位)。 |
非负整数 |
输入 |
kernel |
指向滤波核值的指针。 |
非空 |
输入/输出 |
kernelSize |
滤波核大小。 |
正奇数 |
输入 |
kernelVolume |
滤波核体积。 |
正奇数 |
输入 |
numChannels |
图像通道数。 |
1 |
输入 |
pSpecSize |
pSpec分配空间的大小。 |
非空 |
输入/输出 |
dstRoiVolume |
目标体积的感兴趣体积。 |
正整数 |
输入 |
borderType |
边界类型。 |
以下HmppiBorderType的枚举值之一: HMPPI_BORDER_CONST HMPPI_BORDER_REPL HMPPR_BORDER_IN_MEM |
输入 |
borderValue |
指定常量边框像素的常量值,仅当borderType = HMPPI_BORDER_CONST时有意义。 |
数据类型范围内的值 |
输入 |
pSpec |
特殊结构体的指针。 |
非空 |
输入/输出 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
|---|---|
HMPP_STS_NULL_PTR_ERR |
入参中存在空指针。 |
HMPP_STS_SIZE_ERR |
dstRoiVolume、kernelVolume入参中存在值小于等于0。 |
HMPP_STS_STEP_ERR |
srcStep、srcPlaneStep、dstStep、dstPlaneStep小于0。 |
HMPP_STS_CHANNEL_ERR |
通道数不为1。 |
HMPP_STS_OVERFLOW |
kernelVolume的width、height、depth乘积的值溢出。 |
示例
void FilterBorderExample()
{
HmpprVolume kernelVolume = {3, 3, 3};
HmpprVolume dstRoiVolume = {4, 4, 4};
int pSpecSize;
HmppResult result;
HmpprFilterBorderSpec* pSpec;
float* pKernel;
float pSrc[] = {38.014484, 82.609879, 82.758270, 81.367149, 89.961128, 86.196541, 2.654759, 8.122633, 20.915607, 39.117149, 48.680553, 74.702560, 89.141975, 0.049839, 96.961235, 40.884659, 0.073048, 82.266838, 43.245163, 39.711945, 92.387321, 63.789082, 39.633656, 33.714893, 68.096214, 25.101330, 62.661972, 17.430357, 60.464512, 33.217445, 37.544556, 51.155441, 67.719810, 20.685936, 32.905922, 57.153358, 6.772291, 86.404984, 17.585430, 27.213909, 25.116919, 17.515392, 53.564182, 66.432114, 18.855532, 49.816486, 59.853039, 70.812675, 32.314438, 2.026977, 9.393250, 76.235771, 65.080223, 0.228351, 62.949459, 85.970299, 26.796694, 24.186850, 55.365528, 86.225479, 58.701576, 92.171112, 37.857521, 25.761415};
float* pDst;
HmpprBorderType borderType = HMPPR_BORDER_REPL;
int srcStep = dstRoiVolume.width * sizeof(float);
int srcPlaneStep = dstRoiVolume.width * dstRoiVolume.height * sizeof(float);
int dstStep = srcStep;
int dstPlaneStep = srcPlaneStep;
int kernelTotalSize = kernelVolume.width * kernelVolume.height * kernelVolume.depth;
pKernel = HMPPS_Malloc_32f(kernelTotalSize);
int dataTotalSize = dstRoiVolume.width * dstRoiVolume.height * dstRoiVolume.depth;
pDst = HMPPS_Malloc_32f(dataTotalSize);
result = HMPPI_FilterBorderGetSize(kernelVolume, dstRoiVolume, 1, &pSpecSize);
printf("result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
pSpec = (HmpprFilterBorderSpec*)malloc(pSpecSize);
result = HMPPI_CreateKernel3D_32f(pKernel, kernelVolume);
printf("result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
result = HMPPI_FilterBorderInit_32f(pKernel, kernelVolume, 1, pSpec);
printf("result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
float borderValue = pSrc[0];
result = HMPPI_FilterBorder_32f_C1V(pSrc, srcPlaneStep, srcStep,
pDst, dstPlaneStep, dstStep,
dstRoiVolume, borderType,
&borderValue, pSpec);
printf("result = %d\n", result);
if (result != HMPP_STS_NO_ERR) {
return;
}
for (int i = 0; i < dataTotalSize; i++){
printf("%f ", pDst[i]);
}
HMPPI_FilterBorderRelease_32f(pSpec);
}
运行结果:
result = 0 result = 0 result = 0 result = 0 58.525280 59.930946 61.054619 50.821186 55.691948 54.039684 52.591640 46.378212 59.807632 52.972359 42.925503 42.069408 49.808098 51.124119 45.393032 55.123226 52.184692 51.331261 52.249077 45.508347 48.955585 48.016075 47.897266 44.273628 49.801155 47.854038 44.845074 44.447330 42.592846 46.391796 47.622082 56.376503 40.344097 37.633095 42.397793 47.313328 40.404427 40.143230 44.059200 50.277069 45.813835 45.989544 47.561592 50.238838 44.789623 46.495136 49.068993 50.859116 34.800060 29.068176 37.096851 54.951031 32.350891 32.776085 43.875008 61.288776 40.396778 43.783665 51.504829 57.929409 45.802296 48.920952 53.821930 51.945923