FilterLaplacianBorder
此函数将拉普拉斯滤波器应用于源图像src并将结果存储到目标图像dst。边框像素的值根据边框类型和边框值赋值参数获得。此过滤器的内核是参数指定的3x3或5x5大小的矩阵掩码。内核具有以下值,锚点位于中心单元格。
2 4 4 4 2
2 0 2 4 0 -8 0 4
0 -8 0 4 -8 -24 -8 4
2 0 2 4 0 -8 0 4
2 4 4 4 2
此函数所需应用到的buffer空间,需要先使用FilterLaplacianInit来申请,并在主函数中使用该空间。
函数接口声明如下:
- 辅助空间buffer申请与释放函数:
HmppResult HMPPI_FilterLaplacianInit_8u16s_C1R(HmppiSize roiSize, HmppiMaskSize mask, uint8_t **buffer);
HmppResult HMPPI_FilterLaplacianInit_32f_C1R(HmppiSize roiSize, HmppiMaskSize mask, uint8_t **buffer);
HmppResult HMPPI_FilterLaplacianRelease(uint8_t *buffer);
- 主函数:
HmppResult HMPPI_FilterLaplacianBorder_8u16s_C1R(const uint8_t *src, int32_t srcStep, int16_t *dst, int32_t dstStep, HmppiSize roiSize, HmppiMaskSize maskSize, HmppiBorderType borderType, uint8_t borderValue, uint8_t *buffer);
HmppResult HMPPI_FilterLaplacianBorder_32f_C1R(const float *src, int32_t srcStep, float *dst, int32_t dstStep,HmppiSize roiSize, HmppiMaskSize maskSize, HmppiBorderType borderType, float borderValue, uint8_t *buffer);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
---|---|---|---|
src |
指向源向量的指针。 |
非空 |
输入 |
srcStep |
源图像中连续行起点之间的距离(以字节为单位)。 |
(0, INT_MAX] |
输入 |
dst |
指向目的向量的指针。 |
非空 |
输出 |
dstStep |
目标图像中连续行的起点之间的距离(以字节为单位)。 |
(0, INT_MAX] |
输入 |
roiSize |
源和目标图像感兴趣区域的大小(以像素为单位)。 |
roiSize.width∈(0, INT_MAX],roiSize.height∈(0, INT_MAX] |
输入 |
maskSize |
预定义掩码 |
HmppMskSize3x3 或 HmppMskSize5x5 |
输入 |
borderType |
边界类型 |
以下HmppiBorderType的枚举值之一: HMPPI_BORDER_CONST HMPPI_BORDER_REPL HMPPI_BORDER_MIRROR |
输入 |
borderValue |
指定常量边框像素的常量值,仅当borderType = HMPPI_BORDER_CONST时有意义。 |
数据类型范围内的值 |
输入 |
buffer |
指向计算所需缓冲区的指针。在init中申请空间与初始化,在release中释放空间,在主函数中使用申请的空间。 |
非空 |
输入/输出 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
---|---|
HMPP_STS_NULL_PTR_ERR |
src、dst这两个入参中存在空指针。 |
HMPP_STS_SIZE_ERR |
roiSize.width、roiSize.height这两个入参中存在值小于等于0。 |
HMPP_STS_STEP_ERR |
srcStep、dstStep小于等于0。 |
HMPP_STS_ROI_ERR |
roiSize.width与数据类型大小的乘积大于srcStep或dstStep。 |
HMPP_STS_NOT_EVEN_STEP_ERR |
srcStep(dstStep)不能被src(dst)所属数据类型的字节长度整除。 |
HMPP_STS_BAD_ARG_ERR |
不支持的borderType类型值或者不支持的maskSize值。 |
示例
#define SRC_BUFFER_SIZE_T 28 #define DST_BUFFER_SIZE_T 16 int LaplacianBorderExample() { HmppiSize roi = { 2, 4 }; const float src[SRC_BUFFER_SIZE_T] = { 9.8375815e-16, 4.5484828e-16, 1.4972698e-14, -1.3397389e+25, 1.9061152e+27, -8.8007769e+17, -217025.86, -6.2768196e+14, 4.4335606e+33, 1.0258707e-13, -9.3150633e-11, -5192.7163, 2.536292e+25, 6.0832354e+15, 8.5712402e+29, -0.15451884, -0.2848247, -2.1714717e+10, 2.7212473e+17, -1.3591454e-22, 7.6473188e+21, -2.2729285e-30, 1129877.1, -1.0089557e-05, -1.1054221e+21, -3.8945858e-19, -6.8345717e-34, 60685416}; float dst[DST_BUFFER_SIZE_T] = {0}; int32_t srcStep = 4 * sizeof(float); int32_t dstStep = 4 * sizeof(float); uint8_t *buffer = NULL; HmppResult result = HMPPI_FilterLaplacianInit_32f_C1R(roi, HmppMskSize3x3, &buffer); if (result == HMPP_STS_NO_ERR) { result = HMPPI_FilterLaplacianBorder_32f_C1R(src, srcStep, dst, dstStep, roi, HmppMskSize3x3, HMPPI_BORDER_MIRROR, 0.0f, buffer); } if (result != HMPP_STS_NO_ERR) { printf("result error: %d\n", result); } printf("dst= "); for(int32_t i = 0; i < DST_BUFFER_SIZE_T; i++){ printf("%f ",dst[i]); } printf("\n"); HMPPI_FilterLaplacianRelease(buffer); buffer = NULL; return 0; }
运行结果:
result = 0 dst = -7.0406216e+18 1.5248922e+28 -3.9418209e+28 7.7666443e+28 -1.5248922e+28 1.7734242e+34 5.1225988e+27 -2.04904e+27 -3.5468485e+34 7.7259126e+27 -2.2689171e+31 2.2694294e+31 -2.0290336e+26 3.5468485e+34 0 0