📄 process.cpp
字号:
for (i=0;i<Dx;i++) {
if (!list0[j][i]) continue;
if (!listu[j][i]) list0[j][i]=0;
}
}
for(k=0;k<Dy;k++) {
if (listw[k]) free(listw[k]);
if (listu[k]) free(listu[k]);
}
free(listw);
free(listu);
}
void WINAPI MorphologyThin(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
long i,j,k,mark=1,m=0;
while(mark) {
mark=0;
for (k=0;k<8;k++) {
hmt(list0,list1,Dx,Dy,hMask[k],hMaskLen[k],
mMask[k],mMaskLen[k]);
for (j=0;j<Dy;j++) {
for (i=0;i<Dx;i++) {
if (list0[j][i]==1) {
mark=1;
list1[j][i]=0;
}
}
}
}
}
}
void CreateDeleteTable(int *tab)
{
int Mask[8][8]={{1,2,0,0,0,2,1,1},{0,2,1,1,1,2,0,0},
{0,0,0,2,1,1,1,2},{1,1,1,2,0,0,0,2},
{2,0,0,0,2,1,1,1},{2,1,1,1,2,0,0,0},
{0,0,2,1,1,1,2,0},{1,1,2,0,0,0,2,1}};
int Table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int i,j,k,n,s,t[4],tn;
for (i=0;i<256;i++) tab[i]=0;
for (i=0;i<8;i++) {
s=0;
tn=0;
for (j=0;j<8;j++) {
if (Mask[i][j]==1) s |= Table[j];
else if (Mask[i][j]==2) {
t[tn++] = Table[j];
}
}
for (j=0;j<2;j++) {
n=s;
if (j) n |= t[0];
for (k=0;k<2;k++) {
if (k) n |= t[1];
tab[n]=8*(i+1)+2*j+k;
}
}
}
}
int CrossM(BYTE **list,int x,int y)
{
int i,t;
int Mask3[9][2] ={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},
{-1, 0},{-1, 1},{ 0, 1},{ 1, 1},{ 1, 0}};
for (i=0,t=0; i<8; i++) {
if ((list[y+Mask3[i][1]][x+Mask3[i][0]]==0)&&
(list[y+Mask3[i+1][1]][x+Mask3[i+1][0]]>=1)) t++;
}
return(t);
}
void WINAPI PatternThin(BYTE **list,int Dx,int Dy)
{
int DeleteTab[256],mark=1;
int Mask[8][2]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},
{-1, 0},{-1, 1},{ 0, 1},{ 1, 1}};
int Table[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
long i,j,k,n,model,a,b,c;
BYTE **listw,*bufw;
bufw =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
for(j=0;j<Dy;j++) {
listw[j]=bufw+j*Dx;
memcpy(listw[j],list[j],Dx);
}
CreateDeleteTable(DeleteTab);
n=0;
while(mark) {
mark=0;
if (n%2==0) {
a=c=b=1;
}
else {
a=Dx-2;
c=Dy-2;
b=-1;
}
for (j=c;j<Dy-1 && j>0;j+=b) {
for (i=a;i<Dx-1 && i>0;i+=b) {
if (list[j][i]==0) continue;
model=0;
for (k=0;k<8;k++) {
if (list[j+Mask[k][1]][i+Mask[k][0]])
model |= Table[k];
}
if (DeleteTab[model]) {
if (CrossM(listw,i,j)<2) {
mark=1;
listw[j][i]=0;
}
}
}
}
n++;
for (j=1;j<Dy-1;j++)
memcpy(list[j],listw[j],Dx);
}
free(bufw);
free(listw);
}
void WINAPI gerosion(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
int i,j,k,m,n,g;
BYTE *bp,*p;
BYTE Mask[25];
memset(Mask,1,9);
for(i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
p=Mask;
for (m=0,g=255;m<3;m++) {
bp=list1[i-1+m]+j-1;
for (n=0;n<3;n++) {
if (*p++) {
k=(*bp++);
if (k<g) g=k;
}
}
}
list0[i][j] = g;
}
}
}
void WINAPI gdilation(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
int i,j,k,m,n,g;
BYTE *bp,*p;
BYTE Mask[25];
memset(Mask,1,9);
for(i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
p=Mask;
for (m=0,g=0;m<3;m++) {
bp=list1[i-1+m]+j-1;
for (n=0;n<3;n++) {
if (*p++) {
k=(*bp++);
if (k>g) g=k;
}
}
}
list0[i][j] = g;
}
}
}
void WINAPI GErosion(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
gerosion(list0,list1,Dx,Dy);
}
void WINAPI GDilation(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
gdilation(list0,list1,Dx,Dy);
}
void WINAPI GGrad(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
BYTE *bufw;
BYTE **listw;
int i,j;
bufw =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
for(i=0;i<Dy;i++) listw[i]=bufw+i*Dx;
gdilation(list0,list1,Dx,Dy);
gerosion(listw,list1,Dx,Dy);
for (i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
list0[i][j]=list0[i][j]-listw[i][j];
}
}
free(bufw);
free(listw);
}
void WINAPI GIBorder(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
int i,j;
gerosion(list0,list1,Dx,Dy);
for (i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
list0[i][j] = list1[i][j]-list0[i][j];
}
}
}
void WINAPI GOBorder(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
int i,j;
gdilation(list0,list1,Dx,Dy);
for (i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
list0[i][j] = list0[i][j]-list1[i][j];
}
}
}
int G_Thre=1;
void WINAPI GTopHat(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
BYTE *bufw;
BYTE **listw;
int i,j,k;
bufw =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
for(i=0;i<Dy;i++) listw[i]=bufw+i*Dx;
gerosion(list0,list1,Dx,Dy);
gdilation(listw,list0,Dx,Dy);
for (i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
k=(int) list1[i][j]-listw[i][j];
if (k>=G_Thre) k=1;
else k=0;
list0[i][j]=k;
}
}
free(bufw);
free(listw);
}
void WINAPI GBlackTopHat(BYTE **list0,BYTE **list1,int Dx,int Dy)
{
BYTE *bufw;
BYTE **listw;
int i,j,k;
bufw =(BYTE*) malloc(Dx*Dy*sizeof(BYTE));
listw=(BYTE**) malloc(Dy*sizeof(BYTE*));
for(i=0;i<Dy;i++) listw[i]=bufw+i*Dx;
gdilation(list0,list1,Dx,Dy);
gerosion(listw,list0,Dx,Dy);
for (i=1;i<Dy-1;i++) {
for (j=1;j<Dx-1;j++) {
k=(int) listw[i][j]-list1[i][j];
if (k>=G_Thre) k=0;
else k=1;
list0[i][j]=k;
}
}
free(bufw);
free(listw);
}
long WINAPI SearchScale(long *pg,int n)
{
int i,j,k,m;
int tab[256];
long max;
for (i=0;i<256;i++) tab[i]=i;
for (i=0;i<255;i++) {
max=pg[tab[i]];
k=i;
for (j=i+1;j<256;j++) {
if (pg[tab[j]]>max) {
max=pg[tab[j]];
k=j;
}
}
m=tab[k]; tab[k]=tab[i];
tab[i]=m;
}
if (n>0) n--;
return(pg[tab[n]]);
}
void TableSmooth(long *pg, int m, int n) // 曲线平滑
{
int i,j,k;
for (j=0;j<n;j++) {
k=pg[0];
for (i=1;i<m-1;i++) pg[i-1]=(pg[i-1]+pg[i]+pg[i+1])/3;
for (i=m-1;i>0;i--) pg[i]=pg[i-1];
pg[0]=k;
}
}
//----------------------------------------------------------------------
#define BOUND(x,mn,mx) ((x)<(mn)?(mn):((x)>(mx)?(mx):(x)))
int calchue(int angle,int col1,int col2,int min) // 计算色调值
{
int rcode;
rcode=(int) (256.0*(angle+((120.0)*(col1-min)/
(col1+col2-(min+min))))/360.0+0.5);
return(rcode);
}
void maxmin(int val1,int val2,int val3,int *max,int *min)
{ // 求三个数中的最大、最小值
if (val1>=val2) {
if (val1>=val3) {
*max = val1;
*min = (val2<=val3) ? val2 : val3;
}
else {
*max=val3; *min=val2;
}
}
else {
if (val2>=val3) {
*max = val2;
*min = (val1<=val3) ? val1 :val3;
}
else {
*max=val3; *min=val1;
}
}
}
void WINAPI RgbToHsv(BYTE *hsvpal,BYTE *rgbpal,int count)
{ // RGB 模式转换成 HSV 模式
int hue,sat,red,grn,blu,col1,col2,angle;
int j,max,min;
for (j=0;j<count;j++) {
blu=*rgbpal++; grn=*rgbpal++;
red=*rgbpal++;
maxmin(red,grn,blu,&max,&min);
if (max==min) {
hue=0; sat=0;
}
else {
if (min==blu) {
angle=0; col1=grn; col2=red;
}
else if (min==red) {
angle=120; col1=blu; col2=grn;
}
else if (min==grn) {
angle=240; col1=red; col2=blu;
}
hue=calchue(angle,col1,col2,min);
sat=(int) (255.0*(max-min)/max);
}
*hsvpal++=(BYTE) hue;
*hsvpal++=(BYTE) sat;
*hsvpal++=(BYTE) max;
}
}
void WINAPI HsvToRgb(BYTE *rgbpal,BYTE *hsvpal,int count)
{ // HSV 模式转换成 RGB 模式
int j,red,grn,blu,hue,sat,max,min;
for (j=0;j<count;j++) {
hue=*hsvpal++; sat=*hsvpal++;
max=*hsvpal++;
hue=(int)(360.0*hue/255.0);
if (sat==0) {
red=grn=blu=max;
}
else {
min=(int)((255.0-sat)*max/255.0);
if (hue<=120) {
blu=min;
if (hue<=60) {
red=max;
grn=(int)(min+(double)hue*(max-min)/(120.0-hue));
}
else {
grn=max;
red=(int)(min+(120.0-hue)*(max-min)/hue);
}
}
else if (hue<=240) {
red=min;
if (hue<=180) {
grn=max;
blu=(int)(min+(hue-120.0)*(max-min)/(240.0-hue));
}
else {
blu=max;
grn=(int)(min+(240.0-hue)*(max-min)/(hue-120.0));
}
}
else {
grn=min;
if (hue<=300) {
blu=max;
red=(int)(min+(hue-240.0)*(max-min)/(360.0-hue));
}
else {
red=max;
blu=(int)(min+(360.0-hue)*(max-min)/(hue-240.0));
}
}
}
*rgbpal++=(BYTE) blu;
*rgbpal++=(BYTE) grn;
*rgbpal++=(BYTE) red;
}
}
int WINAPI HueHistogShift(long *pg)
{
int i,j,p,dp;
long pg0[256],kk;
BYTE *buf1,*buf0;
p=42;
for (i=0;i<256;i++) {
pg0[i]=0;
for (j=i-p;j<i+p;j++) pg0[i]+=pg[(j+256)%256];
}
kk=pg0[0]; dp=0;
for (i=0;i<256;i+=85) {
if (pg0[i]<kk) {
kk=pg0[i];
dp=i;
}
}
buf0=(BYTE*) (&pg0[256-dp]);
buf1=(BYTE*) (&pg[0]);
memcpy(buf0,buf1,sizeof(long)*dp);
buf0=(BYTE*) (&pg0[0]);
buf1=(BYTE*) (&pg[dp]);
memcpy(buf0,buf1,sizeof(long)*(256-dp));
buf0=(BYTE*) (&pg0[0]);
buf1=(BYTE*) (&pg[0]);
memcpy(buf1,buf0,sizeof(long)*256);
return(dp);
}
double DoubleTab[256];
void WINAPI RgbToYiq(BYTE *yiqpal,BYTE *rgbpal,int count)
{
int i,x;
double B,G,R,Y,I,Q;
for (x=0,i=0;x<count;x++,i+=3) {
B=DoubleTab[rgbpal[i]];
G=DoubleTab[rgbpal[i+1]];
R=DoubleTab[rgbpal[i+2]];
Y=0.29889531*R+0.58662247*G+0.11448223*B;
I=0.59597799*R-0.27417610*G-0.32180189*B;
Q=0.21147017*R-0.52261711*G+0.31114694*B;
yiqpal[i] =(BYTE) (255*Y);
yiqpal[i+1]=(BYTE) ((I/0.595978+1)*127);
yiqpal[i+2]=(BYTE) ((I/0.522617+1)*127);
}
}
double fPow3(double xyz)
{
double t;
if (xyz>0.008856) t=pow(xyz,0.333333);
else t=7.787*xyz+0.1379;
return(t);
}
void WINAPI RgbToLab(BYTE *labpal,BYTE *rgbpal,int count)
{
int i,x;
double B,G,R,X,Y,Z,L,a,b;
for (x=0,i=0;x<count;x++,i+=3) {
B=DoubleTab[rgbpal[i]];
G=DoubleTab[rgbpal[i+1]];
R=DoubleTab[rgbpal[i+2]];
X=0.49018626*R+0.30987954*G+0.19993420*B;
Y=0.17701522*R+0.81232418*G+0.01066060*B;
Z=0.00000000*R+0.01007720*G+0.98992280*B;
if (Y>0.008856)
L=116*pow(Y,0.333333)-16;
else
L=903.3*Y;
a=500*(fPow3(X)-fPow3(Y));
b=200*(fPow3(X)-fPow3(Z));
labpal[i] =(BYTE) (255*L/100);
labpal[i+1]=(BYTE) (255*(a+128.179003)/310.505326);
labpal[i+2]=(BYTE) (255*(b+ 82.377974)/224.847274);
}
}
//------------------------------------------------
int ThreTable[256];
int *code;
POINT *dot;
int code_n,dot_n;
int inc[8][2] = { {+1, 0},{+1,-1},{ 0,-1},{-1,-1},
{-1, 0},{-1,+1},{ 0,+1},{+1,+1} };
int Trx1,Try1,Trx2,Try2;
int ppp;
long sss;
double factor;
struct TAB *tab;
void set_thre(int track_f, int isr)
{
int k;
for (k=0;k<256;k++) {
if (track_f==0) {
if (k>isr) ThreTable[k]=0;
else ThreTable[k]=1;
}
else {
if (k<isr) ThreTable[k]=0;
else ThreTable[k]=1;
}
}
}
int WINAPI SingleTrack(BYTE **list,int i,int j,int iop,int *code,int flag)
{
int kw,code_n;
int curr[2],next[2];
int n,n1,u,ki,kj,ns,ne;
if (flag==4) u=2;
else u=1;
code[0]=curr[0]=next[0]=i;
code[1]=curr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -