📄 code_susan.htm
字号:
(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+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+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]) )
#endif
{
corner_list[n].info=0;
corner_list[n].x=j;
corner_list[n].y=i;
corner_list[n].dx=cgx[i*x_size+j];
corner_list[n].dy=cgy[i*x_size+j];
corner_list[n].I=in[i*x_size+j];
n++;
if(n==MAX_CORNERS){
fprintf(stderr,"Too many corners.\n");
exit(1);
}}}}
corner_list[n].info=7;
free(cgx);
free(cgy);
}
/* }}} */
/* {{{ susan_quick(in,r,sf,max_no,corner_list) */
susan_corners_quick(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,i,j;
uchar *p,*cp;
memset (r,0,x_size * y_size * sizeof(int));
for (i=7;i<y_size-7;i++)
for (j=7;j<x_size-7;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){
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)
r[i*x_size+j] = max_no-n;
}}}}}}}}}}}}}}}}}}}
/* to locate the local maxima */
n=0;
for (i=7;i<y_size-7;i++)
for (j=7;j<x_size-7;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]) &&
(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+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+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]) )
#endif
{
corner_list[n].info=0;
corner_list[n].x=j;
corner_list[n].y=i;
x = in[(i-2)*x_size+j-2] + in[(i-2)*x_size+j-1] + in[(i-2)*x_size+j] + in[(i-2)*x_size+j+1] + in[(i-2)*x_size+j+2] +
in[(i-1)*x_size+j-2] + in[(i-1)*x_size+j-1] + in[(i-1)*x_size+j] + in[(i-1)*x_size+j+1] + in[(i-1)*x_size+j+2] +
in[(i )*x_size+j-2] + in[(i )*x_size+j-1] + in[(i )*x_size+j] + in[(i )*x_size+j+1] + in[(i )*x_size+j+2] +
in[(i+1)*x_size+j-2] + in[(i+1)*x_size+j-1] + in[(i+1)*x_size+j] + in[(i+1)*x_size+j+1] + in[(i+1)*x_size+j+2] +
in[(i+2)*x_size+j-2] + in[(i+2)*x_size+j-1] + in[(i+2)*x_size+j] + in[(i+2)*x_size+j+1] + in[(i+2)*x_size+j+2];
corner_list[n].I=x/25;
/*corner_list[n].I=in[i*x_size+j];*/
x = in[(i-2)*x_size+j+2] + in[(i-1)*x_size+j+2] + in[(i)*x_size+j+2] + in[(i+1)*x_size+j+2] + in[(i+2)*x_size+j+2] -
(in[(i-2)*x_size+j-2] + in[(i-1)*x_size+j-2] + in[(i)*x_size+j-2] + in[(i+1)*x_size+j-2] + in[(i+2)*x_size+j-2]);
x += x + in[(i-2)*x_size+j+1] + in[(i-1)*x_size+j+1] + in[(i)*x_size+j+1] + in[(i+1)*x_size+j+1] + in[(i+2)*x_size+j+1] -
(in[(i-2)*x_size+j-1] + in[(i-1)*x_size+j-1] + in[(i)*x_size+j-1] + in[(i+1)*x_size+j-1] + in[(i+2)*x_size+j-1]);
y = in[(i+2)*x_size+j-2] + in[(i+2)*x_size+j-1] + in[(i+2)*x_size+j] + in[(i+2)*x_size+j+1] + in[(i+2)*x_size+j+2] -
(in[(i-2)*x_size+j-2] + in[(i-2)*x_size+j-1] + in[(i-2)*x_size+j] + in[(i-2)*x_size+j+1] + in[(i-2)*x_size+j+2]);
y += y + in[(i+1)*x_size+j-2] + in[(i+1)*x_size+j-1] + in[(i+1)*x_size+j] + in[(i+1)*x_size+j+1] + in[(i+1)*x_size+j+2] -
(in[(i-1)*x_size+j-2] + in[(i-1)*x_size+j-1] + in[(i-1)*x_size+j] + in[(i-1)*x_size+j+1] + in[(i-1)*x_size+j+2]);
corner_list[n].dx=x/15;
corner_list[n].dy=y/15;
n++;
if(n==MAX_CORNERS){
fprintf(stderr,"Too many corners.\n");
exit(1);
}}}}
corner_list[n].info=7;
}
/* }}} */
/* }}} */
/* {{{ main(argc, argv) */
main(argc, argv)
int argc;
char *argv [];
{
/* {{{ vars */
FILE *ofp;
char filename [80],
*tcp;
uchar *in, *bp, *mid;
float dt=4.0;
int *r,
argindex=3,
bt=20,
principle=0,
thin_post_proc=1,
three_by_three=0,
drawing_mode=0,
susan_quick=0,
max_no_corners=1850,
max_no_edges=2650,
mode = 0, i,
x_size, y_size;
CORNER_LIST corner_list;
/* }}} */
if (argc<3)
usage();
get_image(argv[1],&in,&x_size,&y_size);
/* {{{ look at options */
while (argindex < argc)
{
tcp = argv[argindex];
if (*tcp == '-')
switch (*++tcp)
{
case 's': /* smoothing */
mode=0;
break;
case 'e': /* edges */
mode=1;
break;
case 'c': /* corners */
mode=2;
break;
case 'p': /* principle */
principle=1;
break;
case 'n': /* thinning post processing */
thin_post_proc=0;
break;
case 'b': /* simple drawing mode */
drawing_mode=1;
break;
case '3': /* 3x3 flat mask */
three_by_three=1;
break;
case 'q': /* quick susan mask */
susan_quick=1;
break;
case 'd': /* distance threshold */
if (++argindex >= argc){
printf ("No argument following -d\n");
exit(0);}
dt=atof(argv[argindex]);
if (dt<0) three_by_three=1;
break;
case 't': /* brightness threshold */
if (++argindex >= argc){
printf ("No argument following -t\n");
exit(0);}
bt=atoi(argv[argindex]);
break;
}
else
usage();
argindex++;
}
if ( (principle==1) && (mode==0) )
mode=1;
/* }}} */
/* {{{ main processing */
switch (mode)
{
case 0:
/* {{{ smoothing */
setup_brightness_lut(&bp,bt,2);
susan_smoothing(three_by_three,in,dt,x_size,y_size,bp);
break;
/* }}} */
case 1:
/* {{{ edges */
r = (int *) malloc(x_size * y_size * sizeof(int));
setup_brightness_lut(&bp,bt,6);
if (principle)
{
if (three_by_three)
susan_principle_small(in,r,bp,max_no_edges,x_size,y_size);
else
susan_principle(in,r,bp,max_no_edges,x_size,y_size);
int_to_uchar(r,in,x_size*y_size);
}
else
{
mid = (uchar *)malloc(x_size*y_size);
memset (mid,100,x_size * y_size); /* note not set to zero */
if (three_by_three)
susan_edges_small(in,r,mid,bp,max_no_edges,x_size,y_size);
else
susan_edges(in,r,mid,bp,max_no_edges,x_size,y_size);
if(thin_post_proc)
susan_thin(r,mid,x_size,y_size);
edge_draw(in,mid,x_size,y_size,drawing_mode);
}
break;
/* }}} */
case 2:
/* {{{ corners */
r = (int *) malloc(x_size * y_size * sizeof(int));
setup_brightness_lut(&bp,bt,6);
if (principle)
{
susan_principle(in,r,bp,max_no_corners,x_size,y_size);
int_to_uchar(r,in,x_size*y_size);
}
else
{
if(susan_quick)
susan_corners_quick(in,r,bp,max_no_corners,corner_list,x_size,y_size);
else
susan_corners(in,r,bp,max_no_corners,corner_list,x_size,y_size);
corner_draw(in,corner_list,x_size,drawing_mode);
}
break;
/* }}} */
}
/* }}} */
put_image(argv[2],in,x_size,y_size);
}
/* }}} */
</PRE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -