-
Notifications
You must be signed in to change notification settings - Fork 2
/
SHedge_1s.c
122 lines (97 loc) · 2.29 KB
/
SHedge_1s.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# include "math.h"
# include "mex.h"
# define BinN 11 /* bin number */
float x2dist(float *a, float *b, int k)
{
int i;
float T;
T=0;
for (i=0; i<k; i++){
if (a[i]+b[i]!=0){
T=T+(a[i]-b[i])*(a[i]-b[i])/(a[i]+b[i]);}
}
return T;
}
float l2dist(float *a, float *b, int k)
{
int i;
float T;
T=0;
for (i=0; i<k; i++){
T=T+(a[i]-b[i])*(a[i]-b[i]);
}
return T;
}
int maxNum(int a, int b)
{
if (a>b) return a;
else return b;
}
int minNum(int a, int b)
{
if (a>b) return b;
else return a;
}
void mexFunction(
int nargout,
mxArray *out[],
int nargin,
const mxArray *in[]
)
{
int N1, N2, dn, ws, dism;
int i, j, b, k;
int ndim;
const mwSize *dims;
float *up, *bt, *lf, *rt;
float *EdgeMap, *sh_mx;
/* check argument */
if (nargin < 3) {
mexErrMsgTxt("Three input arguments required");
}
if (nargout> 1) {
mexErrMsgTxt("Too many output arguments.");
}
ws = mxGetScalar(in[0]);
dism = mxGetScalar(in[1]);
sh_mx = mxGetData(in[2]);
dims = mxGetDimensions(in[2]);
ndim = 3;
dn = dims[0];
N1 = dims[1];
N2 = dims[2];
out[0] = mxCreateNumericMatrix(N1, N2, mxSINGLE_CLASS, mxREAL);
/*out[1] = mxCreateNumericArray(ndim, dims, mxSINGLE_CLASS, mxREAL);*/
/*out[1] = mxCreateNumericMatrix(BinN,1, mxSINGLE_CLASS,mxREAL);*/
if (out[0]==NULL) {
mexErrMsgTxt("Not enough memory for the output matrix 1");
}
EdgeMap = mxGetData(out[0]);
/*HImap = mxGetPr(out[1]);*/
/*binc = mxGetPr(out[1]);*/
/* Compute Edgeness */
up = mxCalloc(dn, sizeof(float));
bt = mxCalloc(dn, sizeof(float));
rt = mxCalloc(dn, sizeof(float));
lf = mxCalloc(dn, sizeof(float));
for (i=0; i<N1; i++){
for (j=0; j<N2; j++) {
for (k=0; k<dn; k++){
up[k]=sh_mx[k+maxNum(0,i-ws)*dims[0]+j*dims[0]*dims[1]];
}
for (k=0; k<dn; k++){
bt[k]=sh_mx[k+minNum(N1-1,i+ws)*dims[0]+j*dims[0]*dims[1]];
}
for (k=0; k<dn; k++){
lf[k]=sh_mx[k+i*dims[0]+maxNum(0,j-ws)*dims[0]*dims[1]];
}
for (k=0; k<dn; k++){
rt[k]=sh_mx[k+i*dims[0]+minNum(N2-1,j+ws)*dims[0]*dims[1]];
}
if (dism == 1)
EdgeMap[i+j*N1]=x2dist(up,bt,dn)+x2dist(lf,rt,dn);
else
EdgeMap[i+j*N1]=sqrtf(l2dist(up,bt,dn)+l2dist(lf,rt,dn));
}
}
}