📄 process.cpp
字号:
}
}
buf[j++]=i;
for (i=2;i<j-2;i+=2) {
m=buf[i-1];
n=buf[i];
if ((n-m<a)||(abs(tab[m]-tab[n])<b)) {
if (tab[m]>tab[buf[i+1]]) buf[i+1]=buf[i-1];
if (tab[n]>tab[buf[i-2]]) buf[i]=buf[i-2];
for (k=i;k<j;k++) buf[k-2]=buf[k];
j-=2;
i-=2;
continue;
}
m=buf[i+1];
n=buf[i];
if ((m-n<a)||(abs(tab[m]-tab[n])<b)) {
if (tab[m]<tab[buf[i-1]]) buf[i+1]=buf[i-1];
if (tab[n]<tab[buf[i+2]]) buf[i+2]=buf[i];
for (k=i;k<j;k++) buf[k]=buf[k+2];
j-=2;
i-=2;
}
}
if (j>5) {
for (i=2;i<j-1;i+=2) {
m=n=0;
for (k=0;k<buf[i];k++) m+=tab[k];
for (k=buf[i];k<256;k++) n+=tab[k];
buf2[i]=abs(m-n);
}
m=buf2[2];
n=2;
for (i=4;i<j-1;i+=2) {
if (buf2[i]<m) {
m=buf2[i];
n=i;
}
}
thre=buf[n];
}
else if (j>3) thre=buf[2];
else {
if (buf[1]<10) n=buf[0];
else
{
for (k=buf[1]-3;k>5;k--) {
if (tab[k]>h/2) continue;
if (tab[k+1]-tab[k]>=tab[k]-tab[k-2]) {
for (v=k-3;v>k-g;v--)
if (tab[v+1]<tab[v]) break;
if ((v>k-g)&&(tab[k]-tab[v]>g/2)) k=v+2;
if (tab[k]<60) break;
}
}
n=k;
if (k>5) buf[0]=k;
}
if (buf[1]>245) m=buf[2];
else
{
for (k=buf[1]+3;k<250;k++) {
if (tab[k]>h/2) continue;
if (tab[k-1]-tab[k]>=tab[k]-tab[k+2]) {
for (v=k+3;v<k+g;v++)
if (tab[v-1]<tab[v]) break;
if ((v<k+g)&&(tab[k]-tab[v]>g/2)) k=v-2;
break;
}
}
m=k;
if (k<250) buf[2]=k;
}
s=t=0;
for (i=0;i<n;i++) s+=tab[i];
if (m>0)
for (i=m;i<256;i++) t+=tab[i];
if (s>t) thre=n;
else thre=m;
}
*bn=j;
return(thre);
}
//---------------------------------------------------------------------------------
void WINAPI LogPrewitt(BYTE **list0,BYTE **list,int Dx,int Dy,double pi)
{
int i,j,k,a,b;
double buffer[3][2048],table[256],A,B;
for (i=0;i<256;i++) table[i]=log(i+1.0);
for (k=0;k<Dx;k++) buffer[0][k]=table[list[0][k]];
for (k=0;k<Dx;k++) buffer[1][k]=table[list[1][k]];
for (i=1;i<Dy-1;i++) {
for (k=0;k<Dx;k++) buffer[2][k]=table[list[i+1][k]];
for (j=1;j<Dx-1;j++) {
if (list[i][j]>30) {
A = (buffer[0][j+1]+buffer[1][j+1]+buffer[2][j+1])-
(buffer[0][j-1]+buffer[1][j-1]+buffer[2][j-1]);
B = (buffer[2][j-1]+buffer[2][j] +buffer[2][j+1])-
(buffer[0][j-1]+buffer[0][j] +buffer[0][j+1]);
if (fabs(A)+fabs(B)<pi) list0[i][j] = 0;
else list0[i][j] = 1;
}
else {
a = (list[i-1][j+1]+list[i][j+1]+list[i+1][j+1])-
(list[i-1][j-1]+list[i][j-1]+list[i+1][j-1]);
b = (list[i+1][j-1]+list[i+1][j]+list[i+1][j+1])-
(list[i-1][j-1]+list[i-1][j]+list[i-1][j+1]);
if (abs(a)+abs(b)<12) list0[i][j] = 0;
else list0[i][j] = 1;
}
}
memcpy(buffer[0],buffer[1],Dx*sizeof(double));
memcpy(buffer[1],buffer[2],Dx*sizeof(double));
}
}
#define COLOR 0
int WINAPI Cross(int* f)
{
int i,sum;
for (i=1,sum=0; i<=7; i+=2) {
if ((!f[i]) && (f[i+1] || f[i+2])) sum++;
}
return(sum);
}
void WINAPI Hilditch(BYTE **list,int Dx,int Dy)
{
int i,j,k,m,n,flag;
int sum=0, x[10];
char *buf0,**list0;
buf0 =(char*) malloc(Dx*Dy*sizeof(char));
list0=(char**) malloc(Dy*sizeof(char*));
for(k=0;k<Dy;k++) {
list0[k]=buf0+k*Dx;
memcpy(list0[k],list[k],Dx);
}
i=1;
do {
flag=0;
for (k=1; k<Dy-1; k++) {
for (j=1; j<Dx-1; j++) {
if (list0[k][j] != 1) continue;
x[1]=list0[k][j+1]; x[2]=list0[k-1][j+1];
x[3]=list0[k-1][j]; x[4]=list0[k-1][j-1];
x[5]=list0[k][j-1]; x[6]=list0[k+1][j-1];
x[7]=list0[k+1][j]; x[8]=list0[k+1][j+1];
for (m=1,n=0; m<=8; m++) {
if (x[m]==-i) {
x[m]=1;
n++;
}
else if (x[m]<0) x[m]=0;
}
sum=x[1]+x[3]+x[5]+x[7];
if (sum>=4) continue;
x[9]=x[1];
for (m=1, sum=0; m<=8; m++)
if (x[m]==1) sum++;
if ((sum<=1)||(sum-n==0)) continue;
sum=Cross(x);
if (sum!=1) continue;
if (list0[k-1][j]== -i) {
x[3]=0;
sum=Cross(x);
if (sum!=1) continue;
}
if (list0[k][j-1]== -i) {
x[5]=0;
sum=Cross(x);
if (sum!=1) continue;
}
list[k][j]=0;
list0[k][j]=-i;
flag=1;
}
}
i++;
}
while(flag==1);
free(list0);
free(buf0);
}
void WINAPI Deutch(BYTE **list0,int Dx,int Dy)
{
int i,j,k,l,ii,flag;
int sum=0, sum1=0, f[10];
char *buf,**list;
buf =(char*) malloc(Dx*Dy*sizeof(char));
list=(char**) malloc(Dy*sizeof(char*));
for(k=0;k<Dy;k++) {
list[k]=buf+k*Dx;
memcpy(list[k],list0[k],Dx);
}
i=1;
do {
flag=0;
for (k=1; k<Dy-1; k++) {
for (j=1; j<Dx-1; j++) {
if (list[k][j] != 1) continue;
else if (i==1) {
f[1]=list[k][j+1];
f[2]=list[k-1][j+1];
f[3]=list[k-1][j];
f[4]=list[k-1][j-1];
f[5]=list[k][j-1];
f[6]=list[k+1][j-1];
f[7]=list[k+1][j];
f[8]=list[k+1][j+1];
}
else {
f[1]=list[k][j-1];
f[2]=list[k+1][j-1];
f[3]=list[k+1][j];
f[4]=list[k+1][j+1];
f[5]=list[k][j+1];
f[6]=list[k-1][j+1];
f[7]=list[k-1][j];
f[8]=list[k-1][j-1];
}
for (ii=1; ii<=8; ii++) {
if (f[ii]==-i) f[ii]=1;
else if(f[ii]<0) f[ii]=0;
}
f[9]=f[1];
sum=sum1=0;
for (l=1; l<9; l++) {
if ((f[l+1]-f[l])!=0) sum++;
sum1+=f[l];
}
if (sum1==1) continue;
if (sum>4) continue;
if (sum==1 || sum==3) continue;
if ((f[1]*f[3]*f[5])!=0) continue;
if ((f[1]*f[3]*f[7])!=0) continue;
if (sum==4) {
if (f[1]*f[7]!=1 || f[2]+f[6]!=1 ||
f[3]+f[4]+f[5]+f[8]!=0) continue;
if (f[1]*f[3]!=1 || f[4]+f[8]!=1 ||
f[2]+f[5]+f[6]+f[7]!=0) continue;
}
list[k][j] = -i;
list0[k][j]= COLOR;
flag=1;
}
}
i++;
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI FastThin(BYTE **list0,int Dx,int Dy)
{
int i,j,k,flag;
int f[11],ap1,bp1;
char *buf,**list;
buf =(char*) malloc(Dx*Dy*sizeof(char));
list=(char**) malloc(Dy*sizeof(char*));
for(k=0;k<Dy;k++) {
list[k]=buf+k*Dx;
memcpy(list[k],list0[k],Dx);
}
do {
flag=0;
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] != 1) continue;
f[1]=list[j][i];
f[2]=list[j][i-1];
f[3]=list[j+1][i-1];
f[4]=list[j+1][i];
f[5]=list[j+1][i+1];
f[6]=list[j][i+1];
f[7]=list[j-1][i+1];
f[8]=list[j-1][i];
f[9]=list[j-1][i-1];
f[10]=f[2];
for (k=2; k<=10; k++)
f[k] = (f[k]>0) ? 1 : 0;
if (f[4]&&f[6])
if (f[2]||f[8]) continue;
bp1=0;
for (k=2; k<=9; k++)
bp1+=f[k];
if ((bp1<2)||(bp1>6)) continue;
ap1=0;
for (k=2; k<=9; k++)
if ((f[k]==0) && (f[k+1]==1))
ap1++;
if (ap1!=1) continue;
list[j][i]=3;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] == 3) {
list[j][i] = 0;
list0[j][i]= COLOR;
flag=1;
}
}
}
if (flag==0) break;
flag=0;
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] != 1) continue;
f[1]=list[j][i];
f[2]=list[j][i-1];
f[3]=list[j+1][i-1];
f[4]=list[j+1][i];
f[5]=list[j+1][i+1];
f[6]=list[j][i+1];
f[7]=list[j-1][i+1];
f[8]=list[j-1][i];
f[9]=list[j-1][i-1];
f[10]=f[2];
for (k=2; k<=10; k++)
f[k] = (f[k]>0) ? 1 : 0;
if (f[2]&&f[8])
if (f[4]||f[6]) continue;
bp1=0;
for (k=2; k<=9; k++)
bp1+=f[k];
if ((bp1<2)||(bp1>6)) continue;
ap1=0;
for (k=2; k<=9; k++)
if ((f[k]==0) && (f[k+1]==1))
ap1++;
if (ap1!=1) continue;
list[j][i] = 3;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] == 3) {
list[j][i] = 0;
list0[j][i]=COLOR;
flag=1;
}
}
}
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI Naccache(BYTE **list0,int Dx,int Dy)
{
int i,j,k,flag;
int N[8];
char *buf,**list;
buf =(char*) malloc(Dx*Dy*sizeof(char));
list=(char**) malloc(Dy*sizeof(char*));
for(k=0;k<Dy;k++) {
list[k]=buf+k*Dx;
memcpy(list[k],list0[k],Dx);
}
do {
flag=0;
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] != 1) continue;
N[0]=list[j+1][i];
N[1]=list[j+1][i-1];
N[2]=list[j][i-1];
N[3]=list[j-1][i-1];
N[4]=list[j-1][i];
N[5]=list[j-1][i+1];
N[6]=list[j][i+1];
N[7]=list[j+1][i+1];
if (N[0]&&N[4]) continue;
for (k=0;k<8;k++)
if (N[k]==2) N[k]=0;
if (N[0]&&(N[1]||N[2]||N[6]||N[7])&&
(N[2]||(!N[3]))&&(N[6]||(!N[5]))) {
list[j][i]=2;
continue;
}
if (N[4]&&(N[5]||N[6]||N[2]||N[3])&&
(N[6]||(!N[7]))&&(N[2]||(!N[1]))) {
list[j][i]=2;
continue;
}
list[j][i]=3;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i]==2) {
list[j][i] = 0;
list0[j][i] = COLOR;
flag=1;
}
else if (list[j][i]==3)
list[j][i] = 1;
}
}
if (flag==0) break;
flag=0;
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] != 1) continue;
N[0]=list[j+1][i];
N[1]=list[j+1][i-1];
N[2]=list[j][i-1];
N[3]=list[j-1][i-1];
N[4]=list[j-1][i];
N[5]=list[j-1][i+1];
N[6]=list[j][i+1];
N[7]=list[j+1][i+1];
if (N[2]&&N[6]) continue;
for (k=0;k<8;k++)
if (N[k]==2) N[k]=0;
if (N[2]&(N[3]||N[4]||N[0]||N[1])&&
(N[4]||(!N[5]))&&(N[0]||(!N[7]))) {
list[j][i]=2;
continue;
}
if (N[6]&(N[7]||N[0]||N[4]||N[5])&&
(N[0]||(!N[1]))&&(N[4]||(!N[3]))) {
list[j][i]=2;
continue;
}
list[j][i] = 3;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] == 2) {
list[j][i] = 0;
list0[j][i]=COLOR;
flag=1;
}
else if (list[j][i]==3)
list[j][i] = 1;
}
}
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI Pavlidis1(BYTE **list0,int Dx,int Dy)
{
int i,j,k,flag,flag1;
int N[8],neighb;
char *buf,**list;
buf =(char*) malloc(Dx*Dy*sizeof(char));
list=(char**) malloc(Dy*sizeof(char*));
for(k=0;k<Dy;k++) {
list[k]=buf+k*Dx;
memcpy(list[k],list0[k],Dx);
}
do {
flag=0;
for (neighb=0;neighb<=7;neighb+=2) {
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
N[0]=list[j+1][i];
N[1]=list[j+1][i-1];
N[2]=list[j][i-1];
N[3]=list[j-1][i-1];
N[4]=list[j-1][i];
N[5]=list[j-1][i+1];
N[6]=list[j][i+1];
N[7]=list[j+1][i+1];
if ((list[j][i]==1)&&(N[neighb]==0)) {
flag1=0;
if ((N[3]||N[2]||N[1])&&(N[5]||
N[6]||N[7])&&(N[4]!=1)&&(N[0]!=1)) {
flag1=1;
}
else if ((N[3]||N[4]||N[5])&&(N[1]||
N[0]||N[7])&&(N[2]!=1)&&(N[6]!=1)) {
flag1=1;
}
else if ((N[1]==2)&&(N[0]!=1)&&(N[2]!=1)&&
(N[3]||N[4]||N[5]||N[6]||N[7])) {
flag1=1;
}
else if ((N[3]==2)&&(N[2]!=1)&&(N[4]!=1)
&&(N[0]||N[1]||N[7]||N[6]||N[5])) {
flag1=1;
}
else if ((N[5]==2)&&(N[4]!=1)&&(N[6]!=1)
&&(N[7]||N[0]||N[1]||N[2]||N[3])) {
flag1=1;
}
else if ((N[7]==2)&&(N[6]!=1)&&(N[0]!=1)
&&(N[1]||N[2]||N[3]||N[4]||N[5])) {
flag1=1;
}
if (flag1==1) list[j][i]=2;
else {
list[j][i]=3;
flag=1;
}
}
}
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i] == 3) {
list[j][i] = 0;
list0[j][i]= COLOR;
}
}
}
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI Pavlidis2(BYTE **list0,int Dx,int Dy)
{
int i,j,k,c,flag,xx;
int N[8];
unsigned char bdr1,bdr2,bdr4,bdr5;
char *buf,**list;
buf =(char*) malloc(Dx*Dy*sizeof(char));
list=(char**) malloc(Dy*sizeof(char*));
for(k=0;k<Dy;k++) {
list[k]=buf+k*Dx;
memcpy(list[k],list0[k],Dx);
}
c=5;
do {
flag=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -