📄 code_susan.htm
字号:
c=*(cp-*p++);x+=c;y+=4*c;w+=2*c;
c=*(cp-*p);x+=4*c;y+=4*c;w+=4*c;
p+=x_size-3;
c=*(cp-*p++);x+=c;y+=9*c;w-=3*c;
c=*(cp-*p++);y+=9*c;
c=*(cp-*p);x+=c;y+=9*c;w+=3*c;
if (y==0)
z = 1000000.0;
else
z = ((float)x) / ((float)y);
if (z < 0.5) { /* vertical */ a=0; b=1; }
else { if (z > 2.0) { /* horizontal */ a=1; b=0; }
else { /* diagonal */ if (w>0) { a=-1; b=1; }
else { a=1; b=1; }}}
if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) &&
(m > r[(i+(2*a))*x_size+j+(2*b)]) && (m >= r[(i-(2*a))*x_size+j-(2*b)]) )
mid[i*x_size+j] = 2;
}
}
}
}
/* }}} */
/* {{{ susan_edges_small(in,r,sf,max_no,out) */
susan_edges_small(in,r,mid,bp,max_no,x_size,y_size)
uchar *in, *bp, *mid;
int *r, max_no, x_size, y_size;
{
float z;
int do_symmetry, i, j, m, n, a, b, x, y, w;
uchar c,*p,*cp;
memset (r,0,x_size * y_size * sizeof(int));
max_no = 730; /* ho hum ;) */
for (i=1;i<y_size-1;i++)
for (j=1;j<x_size-1;j++)
{
n=100;
p=in + (i-1)*x_size + j - 1;
cp=bp + in[i*x_size+j];
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p);
p+=x_size-2;
n+=*(cp-*p);
p+=2;
n+=*(cp-*p);
p+=x_size-2;
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p);
if (n<=max_no)
r[i*x_size+j] = max_no - n;
}
for (i=2;i<y_size-2;i++)
for (j=2;j<x_size-2;j++)
{
if (r[i*x_size+j]>0)
{
m=r[i*x_size+j];
n=max_no - m;
cp=bp + in[i*x_size+j];
if (n>250)
{
p=in + (i-1)*x_size + j - 1;
x=0;y=0;
c=*(cp-*p++);x-=c;y-=c;
c=*(cp-*p++);y-=c;
c=*(cp-*p);x+=c;y-=c;
p+=x_size-2;
c=*(cp-*p);x-=c;
p+=2;
c=*(cp-*p);x+=c;
p+=x_size-2;
c=*(cp-*p++);x-=c;y+=c;
c=*(cp-*p++);y+=c;
c=*(cp-*p);x+=c;y+=c;
z = sqrt((float)((x*x) + (y*y)));
if (z > (0.4*(float)n)) /* 0.6 */
{
do_symmetry=0;
if (x==0)
z=1000000.0;
else
z=((float)y) / ((float)x);
if (z < 0) { z=-z; w=-1; }
else w=1;
if (z < 0.5) { /* vert_edge */ a=0; b=1; }
else { if (z > 2.0) { /* hor_edge */ a=1; b=0; }
else { /* diag_edge */ if (w>0) { a=1; b=1; }
else { a=-1; b=1; }}}
if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) )
mid[i*x_size+j] = 1;
}
else
do_symmetry=1;
}
else
do_symmetry=1;
if (do_symmetry==1)
{
p=in + (i-1)*x_size + j - 1;
x=0; y=0; w=0;
/* | \
y -x- w
| \ */
c=*(cp-*p++);x+=c;y+=c;w+=c;
c=*(cp-*p++);y+=c;
c=*(cp-*p);x+=c;y+=c;w-=c;
p+=x_size-2;
c=*(cp-*p);x+=c;
p+=2;
c=*(cp-*p);x+=c;
p+=x_size-2;
c=*(cp-*p++);x+=c;y+=c;w-=c;
c=*(cp-*p++);y+=c;
c=*(cp-*p);x+=c;y+=c;w+=c;
if (y==0)
z = 1000000.0;
else
z = ((float)x) / ((float)y);
if (z < 0.5) { /* vertical */ a=0; b=1; }
else { if (z > 2.0) { /* horizontal */ a=1; b=0; }
else { /* diagonal */ if (w>0) { a=-1; b=1; }
else { a=1; b=1; }}}
if ( (m > r[(i+a)*x_size+j+b]) && (m >= r[(i-a)*x_size+j-b]) )
mid[i*x_size+j] = 2;
}
}
}
}
/* }}} */
/* }}} */
/* {{{ corners */
/* {{{ corner_draw(in,corner_list,drawing_mode) */
corner_draw(in,corner_list,x_size,drawing_mode)
uchar *in;
CORNER_LIST corner_list;
int x_size, drawing_mode;
{
uchar *p;
int n=0;
while(corner_list[n].info != 7)
{
if (drawing_mode==0)
{
p = in + (corner_list[n].y-1)*x_size + corner_list[n].x - 1;
*p++=255; *p++=255; *p=255; p+=x_size-2;
*p++=255; *p++=0; *p=255; p+=x_size-2;
*p++=255; *p++=255; *p=255;
n++;
}
else
{
p = in + corner_list[n].y*x_size + corner_list[n].x;
*p=0;
n++;
}
}
}
/* }}} */
/* {{{ susan(in,r,sf,max_no,corner_list) */
susan_corners(in,r,bp,max_no,corner_list,x_size,y_size)
uchar *in, *bp;
int *r, max_no, x_size, y_size;
CORNER_LIST corner_list;
{
int n,x,y,sq,xx,yy,
i,j,*cgx,*cgy;
float divide;
uchar c,*p,*cp;
memset (r,0,x_size * y_size * sizeof(int));
cgx=(int *)malloc(x_size*y_size*sizeof(int));
cgy=(int *)malloc(x_size*y_size*sizeof(int));
for (i=5;i<y_size-5;i++)
for (j=5;j<x_size-5;j++) {
n=100;
p=in + (i-3)*x_size + j - 1;
cp=bp + in[i*x_size+j];
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p);
p+=x_size-3;
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p);
p+=x_size-5;
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p);
p+=x_size-6;
n+=*(cp-*p++);
n+=*(cp-*p++);
n+=*(cp-*p);
if (n<max_no){ /* do this test early and often ONLY to save wasted computation */
p+=2;
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p);
if (n<max_no){
p+=x_size-6;
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p);
if (n<max_no){
p+=x_size-5;
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p);
if (n<max_no){
p+=x_size-3;
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p++);
if (n<max_no){
n+=*(cp-*p);
if (n<max_no)
{
x=0;y=0;
p=in + (i-3)*x_size + j - 1;
c=*(cp-*p++);x-=c;y-=3*c;
c=*(cp-*p++);y-=3*c;
c=*(cp-*p);x+=c;y-=3*c;
p+=x_size-3;
c=*(cp-*p++);x-=2*c;y-=2*c;
c=*(cp-*p++);x-=c;y-=2*c;
c=*(cp-*p++);y-=2*c;
c=*(cp-*p++);x+=c;y-=2*c;
c=*(cp-*p);x+=2*c;y-=2*c;
p+=x_size-5;
c=*(cp-*p++);x-=3*c;y-=c;
c=*(cp-*p++);x-=2*c;y-=c;
c=*(cp-*p++);x-=c;y-=c;
c=*(cp-*p++);y-=c;
c=*(cp-*p++);x+=c;y-=c;
c=*(cp-*p++);x+=2*c;y-=c;
c=*(cp-*p);x+=3*c;y-=c;
p+=x_size-6;
c=*(cp-*p++);x-=3*c;
c=*(cp-*p++);x-=2*c;
c=*(cp-*p);x-=c;
p+=2;
c=*(cp-*p++);x+=c;
c=*(cp-*p++);x+=2*c;
c=*(cp-*p);x+=3*c;
p+=x_size-6;
c=*(cp-*p++);x-=3*c;y+=c;
c=*(cp-*p++);x-=2*c;y+=c;
c=*(cp-*p++);x-=c;y+=c;
c=*(cp-*p++);y+=c;
c=*(cp-*p++);x+=c;y+=c;
c=*(cp-*p++);x+=2*c;y+=c;
c=*(cp-*p);x+=3*c;y+=c;
p+=x_size-5;
c=*(cp-*p++);x-=2*c;y+=2*c;
c=*(cp-*p++);x-=c;y+=2*c;
c=*(cp-*p++);y+=2*c;
c=*(cp-*p++);x+=c;y+=2*c;
c=*(cp-*p);x+=2*c;y+=2*c;
p+=x_size-3;
c=*(cp-*p++);x-=c;y+=3*c;
c=*(cp-*p++);y+=3*c;
c=*(cp-*p);x+=c;y+=3*c;
xx=x*x;
yy=y*y;
sq=xx+yy;
if ( sq > ((n*n)/2) )
{
if(yy<xx) {
divide=(float)y/(float)abs(x);
sq=abs(x)/x;
sq=*(cp-in[(i+FTOI(divide))*x_size+j+sq]) +
*(cp-in[(i+FTOI(2*divide))*x_size+j+2*sq]) +
*(cp-in[(i+FTOI(3*divide))*x_size+j+3*sq]);}
else {
divide=(float)x/(float)abs(y);
sq=abs(y)/y;
sq=*(cp-in[(i+sq)*x_size+j+FTOI(divide)]) +
*(cp-in[(i+2*sq)*x_size+j+FTOI(2*divide)]) +
*(cp-in[(i+3*sq)*x_size+j+FTOI(3*divide)]);}
if(sq>290){
r[i*x_size+j] = max_no-n;
cgx[i*x_size+j] = (51*x)/n;
cgy[i*x_size+j] = (51*y)/n;}
}
}
}}}}}}}}}}}}}}}}}}}
/* to locate the local maxima */
n=0;
for (i=5;i<y_size-5;i++)
for (j=5;j<x_size-5;j++) {
x = r[i*x_size+j];
if (x>0) {
/* 5x5 mask */
#ifdef FIVE_SUPP
if (
(x>r[(i-1)*x_size+j+2]) &&
(x>r[(i )*x_size+j+1]) &&
(x>r[(i )*x_size+j+2]) &&
(x>r[(i+1)*x_size+j-1]) &&
(x>r[(i+1)*x_size+j ]) &&
(x>r[(i+1)*x_size+j+1]) &&
(x>r[(i+1)*x_size+j+2]) &&
(x>r[(i+2)*x_size+j-2]) &&
(x>r[(i+2)*x_size+j-1]) &&
(x>r[(i+2)*x_size+j ]) &&
(x>r[(i+2)*x_size+j+1]) &&
(x>r[(i+2)*x_size+j+2]) &&
(x>=r[(i-2)*x_size+j-2]) &&
(x>=r[(i-2)*x_size+j-1]) &&
(x>=r[(i-2)*x_size+j ]) &&
(x>=r[(i-2)*x_size+j+1]) &&
(x>=r[(i-2)*x_size+j+2]) &&
(x>=r[(i-1)*x_size+j-2]) &&
(x>=r[(i-1)*x_size+j-1]) &&
(x>=r[(i-1)*x_size+j ]) &&
(x>=r[(i-1)*x_size+j+1]) &&
(x>=r[(i )*x_size+j-2]) &&
(x>=r[(i )*x_size+j-1]) &&
(x>=r[(i+1)*x_size+j-2]) )
#endif
#ifdef SEVEN_SUPP
if (
(x>r[(i-3)*x_size+j-3]) &&
(x>r[(i-3)*x_size+j-2]) &&
(x>r[(i-3)*x_size+j-1]) &&
(x>r[(i-3)*x_size+j ]) &&
(x>r[(i-3)*x_size+j+1]) &&
(x>r[(i-3)*x_size+j+2]) &&
(x>r[(i-3)*x_size+j+3]) &&
(x>r[(i-2)*x_size+j-3]) &&
(x>r[(i-2)*x_size+j-2]) &&
(x>r[(i-2)*x_size+j-1]) &&
(x>r[(i-2)*x_size+j ]) &&
(x>r[(i-2)*x_size+j+1]) &&
(x>r[(i-2)*x_size+j+2]) &&
(x>r[(i-2)*x_size+j+3]) &&
(x>r[(i-1)*x_size+j-3]) &&
(x>r[(i-1)*x_size+j-2]) &&
(x>r[(i-1)*x_size+j-1]) &&
(x>r[(i-1)*x_size+j ]) &&
(x>r[(i-1)*x_size+j+1]) &&
(x>r[(i-1)*x_size+j+2]) &&
(x>r[(i-1)*x_size+j+3]) &&
(x>r[(i)*x_size+j-3]) &&
(x>r[(i)*x_size+j-2]) &&
(x>r[(i)*x_size+j-1]) &&
(x>=r[(i)*x_size+j+1]) &&
(x>=r[(i)*x_size+j+2]) &&
(x>=r[(i)*x_size+j+3]) &&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -