C#图像处理之边缘检测(Smoothed)的方法
本文实例讲述了C#图像处理之边缘检测(Smoothed)的方法。分享给大家供大家参考。具体如下:
//定义smoothed算子边缘检测函数
privatestaticBitmapsmoothed(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(r3+r5+r8-r1-r4-r6)+Math.Abs(r1+r2+r3-r6-r7-r8));
vG=(double)(Math.Abs(g3+g5+g8-g1-g4-g6)+Math.Abs(g1+g2+g3-g6-g7-g8));
vB=(double)(Math.Abs(b3+b5+b8-b1-b4-b6)+Math.Abs(b1+b2+b3-b6-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#程序设计有所帮助。