📄 process.cpp
字号:
c++;
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];
bdr1=0;
for (k=0;k<=7;k++)
if (N[k]>=1) bdr1 |= 0x80 >> k;
if ((bdr1&0252)==0252) continue;
list[j][i]=2;
flag=1;
xx=0;
for (k=0;k<=7;k++)
xx+= bdr1 & (0x80 >> k);
if (xx<=1) list[j][i]=3;
else if ((bdr1&0160)&&(bdr1&7)
&&(!(bdr1&0210)))
list[j][i]=3;
else if ((bdr1&0301)&&(bdr1&034)
&&(!(bdr1&042)))
list[j][i]=3;
else if ((!(bdr1&0202))&&(bdr1&1))
list[j][i]=3;
else if ((!(bdr1&0240))&&(bdr1&0100))
list[j][i]=3;
else if ((!(bdr1&050))&&(bdr1&020))
list[j][i]=3;
else if ((!(bdr1&012))&&(bdr1&04))
list[j][i]=3;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i]!=2) 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];
bdr1=0; bdr2=0;
for (k=0;k<=7;k++) {
if (N[k]>=1) bdr1 |= 0x80 >> k;
if (N[k]>=2) bdr2 |= 0x80 >> k;
}
if ((bdr1==bdr2)&&(bdr1&0201)
&&(bdr1&07)&&(bdr1&03))
list[j][i]=4;
if (((bdr2&0200)&&(!(bdr1&010)))
&&(((bdr1&01)&&(bdr1&0100))
||(((bdr1&06)&&(bdr1&060))&&
(((bdr1&01)&&(!(bdr1&0100)))
||((!(bdr1&01))&&(bdr1&0100))))))
list[j][i]=4;
else if (((bdr2&040)&&(!(bdr1&02)))
&&(((bdr1&020)&&(bdr1&0100))
||(((bdr1&014)&&(bdr1&0201))&&
(((bdr1&020)&&(!(bdr1&0100)))
||((!(bdr1&020))&&(bdr1&0100)))))
&&(bdr1&07)&&(bdr1&03))
list[j][i]=4;
else if (((bdr2&010)&&(!(bdr1&0200)))
&&(((bdr1&04)&&(bdr1&020))
||(((bdr1&03)&&(bdr1&0140))&&
(((bdr1&04)&&(!(bdr1&020)))
||((!(bdr1&04))&&(bdr1&020)))))
&&(bdr1&0201))
list[j][i]=4;
else if (((bdr2&02)&&(!(bdr1&040)))
&&(((bdr1&01)&&(bdr1&04))
||(((bdr1&0300)&&(bdr1&030))&&
(((bdr1&01)&&(!(bdr1&04)))
||((!(bdr1&01))&&(bdr1&04))))))
list[j][i]=4;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if (list[j][i]!=2) 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];
bdr4=0; bdr5=0;
for (k=0;k<=7;k++) {
if (N[k]>=4) bdr4 |= 0x80 >> k;
if (N[k]>=5) bdr5 |= 0x80 >> k;
}
if (!(bdr4&010)) {
list[j][i]=5;
flag=1;
}
else if ((!(bdr4&040))&&(!bdr5)) {
list[j][i]=5;
flag=1;
}
else if ((list[j][i]==3)||(list[j][i]==4))
list[j][i]=c;
}
}
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
if ((list[j][i]==2)||(list[j][i]==5)) {
list[j][i] = 0;
list0[j][i]= COLOR;
}
}
}
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI Rosenfeld4(BYTE **list0,int Dx,int Dy)
{
int i,j,k,ii,jj,kk,flag;
int N[10];
int jbd[5]={0,-1,1,0,0};
int ibd[5]={0,0,0,1,-1};
char NRND,N48,N26,N24,N46,N68,N82;
char N123,N345,N567,N781;
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 (kk=1;kk<=4;kk++) {
jj=jbd[kk];
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
ii=ibd[kk];
if (!list[j][i]) continue;
if (list[j+jj][i+ii]) continue;
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];
N[8]=list[j+1][i];
NRND=N[2]+N[4]+N[6]+N[8];
if (NRND<=1) continue;
N48=N[4]+N[8];
N567=N[5]+N[6]+N[7];
if (N[2]==1 && N48==0 && N567>0)
continue;
N123=N[1]+N[2]+N[3];
if (N[6]==1 && N48==0 && N123>0)
continue;
N26=N[2]+N[6];
N345=N[3]+N[4]+N[5];
if (N[8]==1 && N26==0 && N345>0)
continue;
N781=N[7]+N[8]+N[1];
if (N[4]==1 && N26==0 && N781>0)
continue;
N46=N[4]+N[6];
if (N[5]==1 && N46==0) continue;
N68=N[6]+N[8];
if (N[7]==1 && N68==0) continue;
N82=N[8]+N[2];
if (N[1]==1 && N82==0) continue;
N24=N[2]+N[4];
if (N[3]==1 && N24==0) continue;
if (N[5]==0 && N46==2) continue;
if (N[7]==0 && N68==2) continue;
if (N[1]==0 && N82==2) continue;
if (N[3]==0 && N24==2) continue;
list0[j][i]=COLOR;
flag=1;
}
}
for (i=0;i<Dy;i++) {
memcpy(list[i],list0[i],Dx);
for (j=0;j<Dx;j++)
if (list[i][j]!=1) list[i][j]=0;
}
}
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI Rosenfeld8(BYTE **list0,int Dx,int Dy)
{
int i,j,k,ii,jj,kk,flag;
int N[10];
int jbd[5]={0,-1,1,0,0};
int ibd[5]={0,0,0,1,-1};
char NRND,N48,N26,N24,N46,N68,N82;
char N123,N345,N567,N781;
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 (kk=1;kk<=4;kk++) {
jj=jbd[kk];
for (j=1; j<Dy-1; j++) {
for (i=1; i<Dx-1; i++) {
ii=ibd[kk];
if (!list[j][i]) continue;
if (list[j+jj][i+ii]) continue;
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];
N[8]=list[j+1][i];
NRND=0;
for (k=1; k<=8; k++)
NRND += N[k];
if (NRND<=1) continue;
N48=N[4]+N[8];
N567=N[5]+N[6]+N[7];
if (N[2]==1 && N48==0 && N567>0)
continue;
N123=N[1]+N[2]+N[3];
if (N[6]==1 && N48==0 && N123>0)
continue;
N26=N[2]+N[6];
N345=N[3]+N[4]+N[5];
if (N[8]==1 && N26==0 && N345>0)
continue;
N781=N[7]+N[8]+N[1];
if (N[4]==1 && N26==0 && N781>0)
continue;
N46=N[4]+N[6];
if (N[5]==1 && N46==0) continue;
N68=N[6]+N[8];
if (N[7]==1 && N68==0) continue;
N82=N[8]+N[2];
if (N[1]==1 && N82==0) continue;
N24=N[2]+N[4];
if (N[3]==1 && N24==0) continue;
list0[j][i]=COLOR;
flag=1;
}
}
for (i=0;i<Dy;i++) {
memcpy(list[i],list0[i],Dx);
for (j=0;j<Dx;j++)
if (list[i][j]!=1) list[i][j]=0;
}
}
}
while(flag==1);
free(list);
free(buf);
}
void WINAPI RemoveNoise(BYTE **list,int Dx,int Dy)
{
long i,j,k,m,n;
BYTE **list0;
list0=(BYTE**)malloc(Dy*sizeof(BYTE*));
for(j=0;j<Dy;j++) {
list0[j]=(BYTE*) malloc(Dx);
memset(list0[j],0,Dx);
}
for (j=1;j<Dy-1;j++) {
for (i=1;i<Dx-1;i++) {
for (m=-1,k=0;m<2;m++) {
for (n=-1;n<2;n++) {
if (list[j+m][i+n]) k++;
}
}
if (k>4) list0[j][i]=1;
}
}
for(j=0;j<Dy;j++) {
memcpy(list[j],list0[j],Dx);
if (list0[j]) free(list0[j]);
}
free(list0);
}
int WINAPI Distance(BYTE **list1,int Dx,int Dy)
{
int i,j,k,ii,jj,g,t,max,m,n;
short **list;
BYTE *lists;
int Mask1[3][3]={7,5,7,5,-1,0,0,0,0};
int Mask2[3][3]={0,0,0,0,-1,5,7,5,7};
m=3;
n=m/2;
list=(short**)malloc(Dy*sizeof(short*));
for(i=0;i<Dy;i++) {
list[i]=(short *) malloc(Dx*sizeof(short));
lists=(BYTE*) list[i];
memcpy(lists,list1[i],Dx);
for (j=Dx-1,k=2*(Dx-1);j>=0;j--,k-=2) {
if (lists[j]>1) lists[k+1]=16;
else lists[k+1]=0;
lists[k]=lists[j];
}
}
for (i=n;i<Dy-n;i++) {
for (j=n;j<Dx-n;j++) {
if (list[i][j]==0) continue;
g=Dx+Dy;
for (ii=0;ii<m;ii++) {
for (jj=0;jj<m;jj++) {
if (Mask1[ii][jj]<0) break;
if (Mask1[ii][jj]==0) continue;
t=list[i-n+ii][j-n+jj]+Mask1[ii][jj];
if (t<g) g=t;
}
if (Mask1[ii][jj]<0) break;
}
list[i][j]= g;
}
}
for (i=Dy-n-1;i>n-1;i--) {
for (j=Dx-n-1;j>n-1;j--) {
if (list[i][j]==0) continue;
g=Dx+Dy;
for (ii=m-1;ii>=0;ii--) {
for (jj=m-1;jj>=0;jj--) {
if (Mask1[ii][jj]<0) break;
if (Mask2[ii][jj]==0) continue;
t=list[i-n+ii][j-n+jj]+Mask2[ii][jj];
if (t<g) g=t;
}
if (Mask1[ii][jj]<0) break;
}
if (list[i][j]>g) list[i][j]= g;
}
}
max=0;
for (i=0;i<Dy;i++) {
for (j=0;j<Dx;j++) {
list[i][j] /= 5;
if (list[i][j]>max) max=list[i][j];
}
}
for(i=0;i<Dy;i++) {
lists=(BYTE*) list[i];
for (j=0,k=0;j<Dx;j++,k+=2) lists[j]=lists[k];
memcpy(list1[i],lists,Dx);
}
for(i=0;i<Dy;i++)
if (list[i]) free(list[i]);
free(list);
return(max);
}
int EDMask[9][2]={{ 0, 0},{-1,0},{ 0,-1},{0,1},{1,0},
{-1,-1},{-1,1},{ 1,-1},{1,1}};
void WINAPI erosion(BYTE **list0,BYTE **list1,int Dx,int Dy,int Mask[][2],int MaskLen)
{
int i,j,k;
for(k=0;k<Dy;k++)
memset(list0[k],0,Dx);
for(j=1;j<Dy-1;j++) {
for(i=1;i<Dx-1;i++){
for(k=0;k<MaskLen;k++) {
if (list1[j+Mask[k][1]][i+Mask[k][0]]==0)
break;
}
if (k==MaskLen) list0[j][i]=1;
}
}
}
void WINAPI dilation(BYTE **list0,BYTE **list1,int Dx,int Dy,int Mask[][2],int MaskLen)
{
int i,j,k;
for(k=0;k<Dy;k++)
memset(list0[k],0,Dx);
for(j=1;j<Dy-1;j++) {
for(i=1;i<Dx-1;i++){
for(k=0;k<MaskLen;k++) {
if (list1[j+Mask[k][1]][i+Mask[k][0]]==1) {
list0[j][i]=1;
break;
}
}
}
}
}
void WINAPI Erosion(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
erosion(list0,list1,Dx,Dy,EDMask,9);
}
void WINAPI Dilation(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
dilation(list0,list1,Dx,Dy,EDMask,9);
}
void WINAPI Inneredge(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
long i, j;
erosion(list0,list1,Dx,Dy,EDMask,9);
for (j=0;j<Dy;j++) {
for (i=0;i<Dx;i++) {
list0[j][i] ^= list1[j][i];
}
}
}
void WINAPI Outteredge(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
long i, j;
dilation(list0,list1,Dx,Dy,EDMask,9);
for (j=0;j<Dy;j++) {
for (i=0;i<Dx;i++) {
list0[j][i] ^= list1[j][i];
}
}
}
void WINAPI Morphologyedge(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
long i,j,mark=1;
BYTE **listw;
listw=(BYTE**)malloc(Dy*sizeof(BYTE*));
for(j=0;j<Dy;j++)
listw[j]=(BYTE*) malloc(Dx);
erosion(list0,list1,Dx,Dy,EDMask,9);
dilation(listw,list1,Dx,Dy,EDMask,9);
for (j=0;j<Dy;j++) {
for (i=0;i<Dx;i++) {
list0[j][i] ^= listw[j][i];
}
}
for(j=0;j<Dy;j++)
if (listw[j]) free(listw[j]);
free(listw);
}
void WINAPI Skeleton(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
long i,j,k,m,mark=1;
BYTE **listw,**listu;
BYTE **lista,**listb,**listc;
listw=(BYTE**)malloc(Dy*sizeof(BYTE*));
listu=(BYTE**)malloc(Dy*sizeof(BYTE*));
for(k=0;k<Dy;k++) {
listw[k]=(BYTE*) malloc(Dx);
listu[k]=(BYTE*) malloc(Dx);
memset(list0[k],0,Dx);
}
lista=list1;
listb=listw;
while(mark) {
erosion(listb,lista,Dx,Dy,EDMask,9);
listc=lista;
lista=listb;
listb=listc;
erosion(listb,lista,Dx,Dy,EDMask,9);
dilation(listu,listb,Dx,Dy,EDMask,9);
mark=0;
for (j=0;j<Dy;j++) {
for (i=0;i<Dx;i++) {
m=lista[j][i] ^ listu[j][i];
list0[j][i] |= m;
mark |= m;
}
}
}
for(k=0;k<Dy;k++) {
if (listw[k]) free(listw[k]);
if (listu[k]) free(listu[k]);
}
free(listw);
free(listu);
}
int hMask[8][9][2]={{{1,1},{0,1},{1,0},{0,0},},
{{-1,0},{-1,-1},{0,-1},{0,0},},
{{-1,0},{-1,1},{0,1},{0,0},},
{{0,-1},{1,-1},{1,0},{0,0},},
{{1,1},{0,1},{-1,1},{0,0},},
{{-1,-1},{0,-1},{1,-1},{0,0},},
{{-1,0},{-1,1},{-1,-1},{0,0},},
{{1,-1},{1,0},{1,1},{0,0}} };
int mMask[8][9][2]={{{-1,0},{-1,-1},{0,-1},},
{{1,1},{0,1},{1,0},},
{{0,-1},{1,-1},{1,0},},
{{-1,0},{-1,1},{0,1},},
{{-1,-1},{0,-1},{1,-1},},
{{1,1},{0,1},{-1,1},},
{{1,-1},{1,0},{1,1},},
{{-1,0},{-1,1},{-1,-1}} };
int hMaskLen[8]={4,4,4,4,4,4,4,4};
int mMaskLen[8]={3,3,3,3,3,3,3,3};
void hmt(BYTE **list0,BYTE **list1,int Dx,int Dy,
int hMask[][2],int hMaskLen,int mMask[][2],int mMaskLen)
{
int i,j,k;
BYTE **listw,**listu;
listw=(BYTE**)malloc(Dy*sizeof(BYTE*));
listu=(BYTE**)malloc(Dy*sizeof(BYTE*));
for(k=0;k<Dy;k++) {
listw[k]=(BYTE*) malloc(Dx);
for (i=0;i<Dx;i++) listw[k][i]=1-list1[k][i];
listu[k]=(BYTE*) malloc(Dx);
}
erosion(list0,list1,Dx,Dy,hMask,hMaskLen);
erosion(listu,listw,Dx,Dy,mMask,mMaskLen);
for (j=0;j<Dy;j++) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -