FilterSobelBorder
将Sobel滤波器应用于源图像src并将结果存储到目标图像dst。边框像素的值根据边框类型和边框值赋值参数获得。此过滤器的内核是参数指定的3x3或5x5大小的矩阵掩码。内核具有以下值,锚点位于中心单元格。
1 2 1
0 0 0
-1 -2 -1
1 4 6 4 1
2 8 12 8 2
0 0 0 0 0
-2 -8 -12 -8 -2
-1 -4 -6 -4 -1
函数声明如下:
HmppResult HMPPI_FilterSobelHorizBorder_32f_C1R(const float* pSrc, int srcStep, float* pDst, int dstStep, HmppiSize roi, HmppiMaskSize maskSize, HmppiBorderType borderType, float borderValue);
HmppResult HMPPI_FilterSobelNegVertBorder_32f_C1R(const float* pSrc, int srcStep, float* pDst, int dstStep, HmppiSize roi, HmppiMaskSize maskSize, HmppiBorderType borderType, float borderValue);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
|---|---|---|---|
pSrc |
指向源向量的指针。 |
非空 |
输入 |
srcStep |
源图像中连续行起点之间的距离(以字节为单位)。 |
(0, INT_MAX] |
输入 |
pDst |
指向目的向量的指针。 |
非空 |
输出 |
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时有意义。 |
数据类型范围内的值 |
输入 |
返回值
- 成功:返回HMPP_STS_NO_ERR。
- 失败:返回错误码。
错误码
错误码 |
描述 |
|---|---|
HMPP_STS_NULL_PTR_ERR |
pSrc、pDst的入参中存在空指针。 |
HMPP_STS_SIZE_ERR |
roiSize.width、roiSize.height的入参中存在值小于等于0。 |
HMPP_STS_STEP_ERR |
srcStep、dstStep小于等于0。 |
HMPP_STS_ROI_ERR |
roiSize.width * 数据类型所占字节数 > 步长。 |
HMPP_STS_NOT_EVEN_STEP_ERR |
srcStep、dstStep不能被src、dst所属数据类型的字节长度整除。 |
HMPP_STS_BAD_ARG_ERR |
不支持的borderType类型值或者不支持的maskSize值。 |
示例
#include <stdio.h>
#include "hmppi.h"
#include "hmpp_type.h"
#define SRC_BUFFER_SIZE_T 28
#define DST_BUFFER_SIZE_T 16
int SobelBorderExample()
{
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(int16_t);
int32_t dstStep = 4 * sizeof(int16_t);
HmppiMaskSize mskSize = HmppMskSize3x3;
HmppResult result = HMPPI_FilterSobelHorizBorder_32f_C1R(src, srcStep, dst, dstStep, roi, mskSize, HMPPI_BORDER_CONST, 0);
if (result != HMPP_STS_NO_ERR) {
printf("result error: %d\n", result);
} else {
printf("result: %d\n", (int)result);
}
printf("dst= ");
for(int32_t i = 0; i < DST_BUFFER_SIZE_T; i++){
printf("%e ",dst[i]);
}
printf("\n");
return 0;
}
int main() {
SobelBorderExample();
return 0;
}
运行结果:
result: 0 dst= -1.339739e+25 -2.679478e+25 3.812230e+27 1.906115e+27 1.339739e+25 2.679478e+25 -3.812230e+27 -1.906115e+27 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00