?? susan.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]) && (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);}/* }}} */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -