包含三个文件:EdgeDetect.cpp;bmp_io.cpp;bmp_io.h; 1. EdgeDetect.cpp
#include #define WINDOW 11 #define ST -5.0 #define VAR 1.0 #define H_THRESHOLD 100.0 #define L_THRESHOLD 15.0 void translate(FILE *f, double **A, BMP N, unsigned char **Q){ int i,j; double max=A[0][0],min=A[0][0]; writehead(f,N.Header); writepalette(f,N.Palette,N.Header.palette_size); for(i=(WINDOW-1)/2;i BMP pic; double **I; double **Ix; double **Iy; double **J; unsigned char **Q; int *Queue; double Gx[WINDOW][WINDOW],Gy[WINDOW][WINDOW]; int i,j,k,l,W,H,cnt,d[10][2],QPtr=0,DD[8][2]; double x=ST,y=ST; for(i=0;i pic.p=new unsigned char [pic.Header.cpr_size]; Queue = new int [pic.Header.cpr_size]; I= new double *[H]; Ix= new double *[H]; Iy= new double *[H]; J= new double *[H]; Q = new unsigned char *[H]; for(i=0;i for(i=0;i writepalette(fp2,pic.Palette,pic.Header.palette_size); for(i=5;i ; ; else Q[i][j]=1; } } } DD[0][0]=DD[1][0]=DD[2][0]=DD[2][1]=DD[3][1]=DD[4][1]=1; DD[4][0]=DD[5][0]=DD[6][0]=DD[6][1]=DD[7][1]=DD[0][1]=-1; DD[1][1]=DD[3][0]=DD[5][1]=DD[7][0]=0; for(i=0;i d[k][1]=(int)((double)(k-5)*Iy[Queue[i]/W][Queue[i]%W]/J[Queue[i]/W][Queue[i]%W]); d[k+5][0]=(int)((double)(k+1)*Ix[Queue[i]/W][Queue[i]%W]/J[Queue[i]/W][Queue[i]%W]) d[k+5][1]=(int)((double)(k+1)*Iy[Queue[i]/W][Queue[i]%W]/J[Queue[i]/W][Queue[i]%W]) } for(k=0;k<10;k++){ if(Q[Queue[i]/W+d[k][0]][Queue[i]%W+d[k][1]]==1){ if(J[Queue[i]/W+d[k][1]][Queue[i]%W-d[k][0]] > L_THRESHOLD){ Q[Queue[i]/W+d[k][1]][Queue[i]%W-d[k][0]]=125; Queue[QPtr]=(Queue[i]/W+d[k][1])*W+Queue[i]%W+d[k][0]; QPtr++; } } } for(k=0;k<8;k++){ if(Q[Queue[i]/W+DD[k][0]][Queue[i]%W+DD[k][1]]==1){ if(J[Queue[i]/W+DD[k][0]][Queue[i]%W+DD[k][1]] > L_THRESHOLD){ Q[Queue[i]/W+DD[k][0]][Queue[i]%W+DD[k][1]]=125; Queue[QPtr]=(Queue[i]/W+DD[k][0])*W+Queue[i]%W+DD[k][1]; QPtr++; } } } } for(i=0;i fprintf(fp2,\"%c\ } return 0; 2.bmp_io.cpp #include void readhead(FILE *f, Header_Type &A) { A.BM=read_short_int(f,false); A.size=read_long_int(f,true); A.r=read_long_int(f,true); A.offset=read_long_int(f,true); A.remain_header=read_long_int(f,true); A.width=read_long_int(f,true); A.height=read_long_int(f,true); A.plane=read_short_int(f,true); A.BPP=read_short_int(f,true); A.compress=read_long_int(f,true); A.cpr_size=read_long_int(f,true); A.H_reso=read_long_int(f,true); A.V_reso=read_long_int(f,true); A.palette_size=read_long_int(f,true); A.important=read_long_int(f,true); return; } void writehead(FILE *f, Header_Type A){ write_short_int(f,A.BM,false); write_long_int(f,A.size,true); write_long_int(f,A.r,true); write_long_int(f,A.offset,true); write_long_int(f,A.remain_header,true); write_long_int(f,A.width,true); write_long_int(f,A.height,true); write_short_int(f,A.plane,true); write_short_int(f,A.BPP,true); write_long_int(f,A.compress,true); write_long_int(f,A.cpr_size,true); write_long_int(f,A.H_reso,true); write_long_int(f,A.V_reso,true); write_long_int(f,A.palette_size,true); write_long_int(f,A.important,true); return; } void readpalette(FILE *f, Palette_Type &X, int size){ int i; X.R = new unsigned char [size]; X.G = new unsigned char [size]; X.B = new unsigned char [size]; X.A = new unsigned char [size]; for(i=0;i short int read_short_int(FILE *f, bool reverse){ unsigned char x,y; fscanf(f,\"%c\ fscanf(f,\"%c\ if(reverse == true) return 256*(int)y + (int)x; else return 256*(int)x + (int)y; } void write_long_int(FILE *f, int X, bool reverse){ int a,b,c,d; a=X/16777216; b=(X/65536)%256; c=(X/256)%256; d=X%256; if(reverse == true) fprintf(f,\"%c%c%c%c\ else fprintf(f,\"%c%c\} void write_short_int(FILE *f, short int X, bool reverse){ int x,y; x=X/256; y=X%256; if(reverse == true) fprintf(f,\"%c%c\ else fprintf(f,\"%c%c\} 3.bmp_io.h struct Header_Type{ short int BM; int size; int r; int offset; int remain_header; int width; int height; short int plane; short int BPP; int compress; int cpr_size; int H_reso; int V_reso; int palette_size; int important; }; struct Palette_Type{ unsigned char *R; unsigned char *G; unsigned char *B; unsigned char *A; }; struct BMP{ Header_Type Header; Palette_Type Palette; unsigned char *p; }; void readhead(FILE *, Header_Type &); void writehead(FILE *, Header_Type); void readpalette(FILE *, Palette_Type &, int); void writepalette(FILE *, Palette_Type, int); int read_long_int(FILE *, bool); void write_long_int(FILE *, int, bool); short int read_short_int(FILE *, bool); void write_short_int(FILE *, short int, bool); 因篇幅问题不能全部显示,请点此查看更多更全内容