Canny算子C++.doc_第1页
Canny算子C++.doc_第2页
Canny算子C++.doc_第3页
Canny算子C++.doc_第4页
Canny算子C++.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Canny算子C+语言实现:包含三个文件:EdgeDetect.cpp;bmp_io.cpp;bmp_io.h;1. EdgeDetect.cpp#include #include #include #include bmp_io.h#define WINDOW11#define ST -5.0#define VAR1.0#define H_THRESHOLD 100.0#define L_THRESHOLD 15.0void translate(FILE *f, double *A, BMP N, unsigned char *Q)int i,j;double max=A00,min=A00;writehead(f,N.Header);writepalette(f,N.Palette,N.Header.palette_size);for(i=(WINDOW-1)/2;iN.Header.height-(WINDOW-1)/2;i+)for(j=(WINDOW-1)/2;jN.Header.width-(WINDOW-1)/2;j+)if(Aijmax)max=Aij;for(i=0;iN.Header.height;i+)for(j=0;jmax)Qij=255;else if(Aijmin)Qij=0;else Qij=(unsigned char)(Aij-min)*254.0)/(max-min)+1.000000001);fprintf(f,%c,Qij);return;int main(void)FILE *fp = fopen(Gray_ChienI.bmp,rb);FILE *fp2 = fopen(Chien_Edge_NT.bmp,wb);BMP pic;double *I;double *Ix;double *Iy;double *J;unsigned char *Q;int *Queue;double GxWINDOWWINDOW,GyWINDOWWINDOW;int i,j,k,l,W,H,cnt,d102,QPtr=0,DD82;double x=ST,y=ST;for(i=0;iWINDOW;i+)y=ST;for(j=0;jWINDOW;j+)Gxij=0.0;Gyij=0.0;Gxij=-x*exp(-(x*x+y*y)/(2*VAR);Gyij=-y*exp(-(x*x+y*y)/(2*VAR);y+=1.0;x+=1.0;readhead(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;iH;i+)Ii = new double W;Ixi = new double W;Iyi = new double W;Ji = new double W;Qi = new unsigned char W;readpalette(fp,pic.Palette,pic.Header.palette_size);for(i=0;ipic.Header.cpr_size;i+)fscanf(fp,%c,&pic.pi);Ii/Wi%W=(double)pic.pi;for(i=0;iH;i+)for(j=0;jW;j+)Ixij=Iyij=Jij=0.0;for(i=0;iH;i+)for(j=0;jW;j+)cnt=0;for(k=0;kWINDOW;k+)for(l=0;lWINDOW;l+)if(i+10-k=H | j+10-l=W)continue;Ixij+=Gxkl*Ii+10-kj+10-l;Iyij+=Gykl*Ii+10-kj+10-l;cnt+;Jij=sqrt(Ixij*Ixij+Iyij*Iyij);for(i=0;iH;i+)for(j=0;jW;j+)Qij=0;writehead(fp2,pic.Header);writepalette(fp2,pic.Palette,pic.Header.palette_size);for(i=5;iH-5;i+)for(j=5;jW-5;j+)for(k=0;k5;k+)dk0=(int)(double)(k-5)*Ixij/Jij);dk1=(int)(double)(k-5)*Iyij/Jij);dk+50=(int)(double)(k+1)*Ixij/Jij);dk+51=(int)(double)(k+1)*Iyij/Jij);l=0;for(k=0;kJij)l=1;break;if(l=0)if(Jij H_THRESHOLD)Qij=255;QueueQPtr=i*W+j;QPtr+;elseQij=1;DD00=DD10=DD20=DD21=DD31=DD41=1;DD40=DD50=DD60=DD61=DD71=DD01=-1;DD11=DD30=DD51=DD70=0;for(i=0;iQPtr;i+)for(k=0;k5;k+)dk0=(int)(double)(k-5)*IxQueuei/WQueuei%W/JQueuei/WQueuei%W);dk1=(int)(double)(k-5)*IyQueuei/WQueuei%W/JQueuei/WQueuei%W);dk+50=(int)(double)(k+1)*IxQueuei/WQueuei%W/JQueuei/WQueuei%W);dk+51=(int)(double)(k+1)*IyQueuei/WQueuei%W/JQueuei/WQueuei%W);for(k=0;k L_THRESHOLD)QQueuei/W+dk1Queuei%W-dk0=125;QueueQPtr=(Queuei/W+dk1)*W+Queuei%W+dk0;QPtr+;for(k=0;k L_THRESHOLD)QQueuei/W+DDk0Queuei%W+DDk1=125;QueueQPtr=(Queuei/W+DDk0)*W+Queuei%W+DDk1;QPtr+;for(i=0;iH;i+)for(j=0;jW;j+)if(Qij=1)Qij=0;fprintf(fp2,%c,Qij);return 0;2.bmp_io.cpp#include #include bmp_io.hvoid 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;isize;i+)fscanf(f,%c,&X.Ri);fscanf(f,%c,&X.Gi);fscanf(f,%c,&X.Bi);fscanf(f,%c,&X.Ai);return;void writepalette(FILE *f, Palette_Type X, int size)for(int i=0;i=0;i-)fscanf(f,%c,&xi);elsefor(i=0;i4;i+)fscanf(f,%c,&xi);return 16777216*(int)x0 + 65536*(int)x1 + 256*(int)x2 + (int)x3;short int read_short_int(FILE *f, bool reverse)unsigned char x,y;fscanf(f,%c,&x);fscanf(f,%c,&y);if(reverse = true)return 256*(int)y + (int)x;elsereturn 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,d,c,b,a);elsefprintf(f,%c%c,a,b,c,d);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,y,x);elsefprintf(f,%c%c,x,y);3.bmp_io.hstruct Header_Typeshort 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_Typeunsigned char *R;unsigned char *G;unsigned char *B;unsigned char *A;struct BMPHeader_Type Header;Palette_Type Palette;unsigned char *p;void readhead(FILE *, Header_Type &);void wr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论