本文实例讲述了C#图像处理之边缘检测(Sobel)的方法。分享给大家供大家参考。具体如下:
//定义sobel算子函数 privatestaticBitmapsobel(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,r1,r2,r3,r4,r5,r6,r7,r8; intg1,g2,g3,g4,g5,g6,g7,g8,g0; intb1,b2,b3,b4,b5,b6,b7,b8,b0; doublevR,vG,vB; //左上 p=pIn-stride-3; r1=p[2]; g1=p[1]; b1=p[0]; //正上 p=pIn-stride; r2=p[2]; g2=p[1]; b2=p[0]; //右上 p=pIn-stride+3; r3=p[2]; g3=p[1]; b3=p[0]; //左 p=pIn-3; r4=p[2]; g4=p[1]; b4=p[0]; //右 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+stride+3; r8=p[2]; g8=p[1]; b8=p[0]; //中心点 p=pIn; r0=p[2]; g0=p[1]; b0=p[0]; //使用模板 vR=(double)(Math.Abs(r1+2*r4+r6-r3-2*r5-r8)+Math.Abs(r1+2*r2+r3-r6-2*r7-r8)); vG=(double)(Math.Abs(g1+2*g4+g6-g3-2*g5-g8)+Math.Abs(g1+2*g2+g3-g6-2*g7-g8)); vB=(double)(Math.Abs(b1+2*b4+b6-b3-2*b5-b8)+Math.Abs(b1+2*b2+b3-b6-2*b7-b8)); 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#程序设计有所帮助。
您可能感兴趣的文章:C#数字图像处理之图像二值化(彩色变黑白)的方法浅谈VisualC#进行图像处理(读取、保存以及对像素的访问)c#数字图像处理的3种方法示例分享C#数字图像处理之图像缩放的方法C#图像处理之边缘检测(Smoothed)的方法C#图像处理之图像均值方差计算的方法C#图像处理之图像平移的方法C#图像处理之木刻效果实现方法C#图像处理的多种方法C#简单数字图像处理程序
在C++中反射调用.NET的方法(三)
C++详解默认参数的构造函数及简单实例代码
上述就是C#学习教程:C#图像处理之边缘检测(Sobel)的方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/906310.html