📄 susan.cpp
字号:
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]) &&
(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) */
void susan_corners_quick(uchar *in,int *r,uchar *bp,int max_no,CORNER_LIST corner_list,int x_size,int y_size)
{
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;
}
/* }}} */
void susan(unsigned char *in,int x_size,int y_size,CORNER_LIST corner_list,
int mode,int bt,float dt,bool principle,bool thin_post_proc,
bool three_by_three,bool drawing_mode,bool susan_quick)
{
int max_no_corners=1850;
int max_no_edges=2650;
unsigned char *bp, *mid;
int *r;
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 = (unsigned char *)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;
} //end of switch
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -