C#图像边缘检测(Roberts)的方法
本文实例讲述了C#图像边缘检测(Roberts)的方法。分享给大家供大家参考。具体如下:
//定义roberts算子函数 privatestaticBitmaprobert(Bitmapa) { intw=a.Width; inth=a.Height; try { BitmapdstBitmap=newBitmap(w,h,System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.BitmapDatasrcData=a.LockBits(newRectangle (0,0,w,h),System.Drawing.Imaging.ImageLockMode.ReadOnly,System.Drawing.Imaging.PixelFormat.Format24bppRgb); System.Drawing.Imaging.BitmapDatadstData=dstBitmap.LockBits(newRectangle (0,0,w,h),System.Drawing.Imaging.ImageLockMode.WriteOnly,System.Drawing.Imaging.PixelFormat.Format24bppRgb); unsafe { byte*pIn=(byte*)srcData.Scan0.ToPointer(); byte*pOut=(byte*)dstData.Scan0.ToPointer(); byte*p; intstride=srcData.Stride; for(inty=0;y<h;y++) { for(intx=0;x<w;x++) { //边缘八个点像素不变 if(x==0||x==w-1||y==0||y==h-1) { pOut[0]=pIn[0]; pOut[1]=pIn[1]; pOut[2]=pIn[2]; } else { intr0,r5,r6,r7; intg5,g6,g7,g0; intb5,b6,b7,b0; doublevR,vG,vB; //右 p=pIn+3; r5=p[2]; g5=p[1]; b5=p[0]; //左下 p=pIn+stride-3; r6=p[2]; g6=p[1]; b6=p[0]; //正下 p=pIn+stride; r7=p[2]; g7=p[1]; b7=p[0]; //中心点 p=pIn; r0=p[2]; g0=p[1]; b0=p[0]; vR=(double)(Math.Abs(r0-r5)+Math.Abs(r5-r7)); vG=(double)(Math.Abs(g0-g5)+Math.Abs(g5-g7)); vB=(double)(Math.Abs(b0-b5)+Math.Abs(b5-b7)); if(vR>0) { vR=Math.Min(255,vR); } else { vR=Math.Max(0,vR); } if(vG>0) { vG=Math.Min(255,vG); } else { vG=Math.Max(0,vG); } if(vB>0) { vB=Math.Min(255,vB); } else { vB=Math.Max(0,vB); } pOut[0]=(byte)vB; pOut[1]=(byte)vG; pOut[2]=(byte)vR; } pIn+=3; pOut+=3; } pIn+=srcData.Stride-w*3; pOut+=srcData.Stride-w*3; } } a.UnlockBits(srcData); dstBitmap.UnlockBits(dstData); returndstBitmap; } catch { returnnull; } }
希望本文所述对大家的C#程序设计有所帮助。