?? susan.c
字號:
susan_edges(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)); for (i=3;i<y_size-3;i++) for (j=3;j<x_size-3;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); p+=2; n+=*(cp-*p++); n+=*(cp-*p++); n+=*(cp-*p); p+=x_size-6; n+=*(cp-*p++); n+=*(cp-*p++); 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); p+=x_size-3; n+=*(cp-*p++); n+=*(cp-*p++); n+=*(cp-*p); if (n<=max_no) r[i*x_size+j] = max_no - n; } for (i=4;i<y_size-4;i++) for (j=4;j<x_size-4;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>600) { p=in + (i-3)*x_size + j - 1; x=0;y=0; 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; z = sqrt((float)((x*x) + (y*y))); if (z > (0.9*(float)n)) /* 0.5 */ { 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]) && (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] = 1; } else do_symmetry=1; } else do_symmetry=1; if (do_symmetry==1) { p=in + (i-3)*x_size + j - 1; x=0; y=0; w=0; /* | \ y -x- w | \ */ 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; p+=x_size-3; c=*(cp-*p++);x+=4*c;y+=4*c;w+=4*c; c=*(cp-*p++);x+=c;y+=4*c;w+=2*c; c=*(cp-*p++);y+=4*c; 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-5; c=*(cp-*p++);x+=9*c;y+=c;w+=3*c; c=*(cp-*p++);x+=4*c;y+=c;w+=2*c; c=*(cp-*p++);x+=c;y+=c;w+=c; c=*(cp-*p++);y+=c; c=*(cp-*p++);x+=c;y+=c;w-=c; c=*(cp-*p++);x+=4*c;y+=c;w-=2*c; c=*(cp-*p);x+=9*c;y+=c;w-=3*c; p+=x_size-6; c=*(cp-*p++);x+=9*c; c=*(cp-*p++);x+=4*c; c=*(cp-*p);x+=c; p+=2; c=*(cp-*p++);x+=c; c=*(cp-*p++);x+=4*c; c=*(cp-*p);x+=9*c; p+=x_size-6; c=*(cp-*p++);x+=9*c;y+=c;w-=3*c; c=*(cp-*p++);x+=4*c;y+=c;w-=2*c; c=*(cp-*p++);x+=c;y+=c;w-=c; c=*(cp-*p++);y+=c; c=*(cp-*p++);x+=c;y+=c;w+=c; c=*(cp-*p++);x+=4*c;y+=c;w+=2*c; c=*(cp-*p);x+=9*c;y+=c;w+=3*c; p+=x_size-5; c=*(cp-*p++);x+=4*c;y+=4*c;w-=4*c; c=*(cp-*p++);x+=c;y+=4*c;w-=2*c; c=*(cp-*p++);y+=4*c; 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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -