您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页Canny算子C++

Canny算子C++

来源:飒榕旅游知识分享网
Canny算子C++语言实现:

包含三个文件:EdgeDetect.cpp;bmp_io.cpp;bmp_io.h; 1. EdgeDetect.cpp

#include #include #include #include \"bmp_io.h\"

#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;imax) max=A[i][j]; } for(i=0;imax) Q[i][j]=255; else if(A[i][j]int main(void){ FILE *fp = fopen(\"Gray_ChienI.bmp\ FILE *fp2 = fopen(\"Chien_Edge_NT.bmp\

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;ireadhead(fp,pic.Header); W=pic.Header.width; H=pic.Header.height;

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;ireadpalette(fp,pic.Palette,pic.Header.palette_size); for(i=0;i for(i=0;i=H || j+10-l<0 || j+10-l>=W) continue; Ix[i][j]+=Gx[k][l]*I[i+10-k][j+10-l]; Iy[i][j]+=Gy[k][l]*I[i+10-k][j+10-l]; cnt++; } } J[i][j]=sqrt(Ix[i][j]*Ix[i][j]+Iy[i][j]*Iy[i][j]); } }

for(i=0;iwritehead(fp2,pic.Header);

writepalette(fp2,pic.Palette,pic.Header.palette_size); for(i=5;iJ[i][j]){ l=1; break; } } if(l==0){ if(J[i][j] > H_THRESHOLD){ Q[i][j]=255; Queue[QPtr]=i*W+j; QPtr++; }

; ;

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;id[k][0]=(int)((double)(k-5)*Ix[Queue[i]/W][Queue[i]%W]/J[Queue[i]/W][Queue[i]%W]);

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 #include \"bmp_io.h\"

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;ivoid writepalette(FILE *f, Palette_Type X, int size){ for(int i=0;iint read_long_int(FILE *f, bool reverse){ unsigned char x[4]; int i; if(reverse == true) for(i=3;i>=0;i--) fscanf(f,\"%c\ else for(i=0;i<4;i++) fscanf(f,\"%c\ return 16777216*(int)x[0] + 65536*(int)x[1] + 256*(int)x[2] + (int)x[3]; }

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);

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务