/// /// 按 Sobel 算子进行边缘检测
///
/// 位图流
///
public Bitmap Sobel(Bitmap b)
{
Matrix3x3 m = new Matrix3x3();
// -1 -2 -1
// 0 0 0
// 1 2 1
m.Init(0);
m.TopLeft = m.TopRight = -1;
m.BottomLeft = m.BottomRight = 1;
m.TopMid = -2;
m.BottomMid = 2;
Bitmap b1 = m.Convolute((Bitmap)b.Clone());
// -1 0 1
// -2 0 2
// -1 0 1
m.Init(0);
m.TopLeft = m.BottomLeft = -1;
m.TopRight = m.BottomRight = 1;
m.MidLeft = -2;
m.MidRight = 2;
Bitmap b2 = m.Convolute((Bitmap)b.Clone());
// 0 1 2
// -1 0 1
// -2 -1 0
m.Init(0);
m.TopMid = m.MidRight = 1;
m.MidLeft = m.BottomMid = -1;
m.TopRight = 2;
m.BottomLeft = -2;
Bitmap b3 = m.Convolute((Bitmap)b.Clone());
// -2 -1 0
// -1 0 1
// 0 1 2
m.Init(0);
m.TopMid = m.MidLeft = -1;
m.MidRight = m.BottomMid = 1;
m.TopLeft = -2;
m.BottomRight = 2;
Bitmap b4 = m.Convolute((Bitmap)b.Clone());
// 梯度运算
b = Gradient(Gradient(b1, b2), Gradient(b3, b4));
b1.Dispose(); b2.Dispose(); b3.Dispose(); b4.Dispose();
return b;
} // end of Sobel
///
/// 按 Prewitt 算子进行边缘检测
///
/// 位图流
///
public Bitmap Prewitt(Bitmap b)
{
Matrix3x3 m = new Matrix3x3();
// -1 -1 -1
// 0 0 0
// 1 1 1
m.Init(0);
m.TopLeft = m.TopMid = m.TopRight = -1;
m.BottomLeft = m.BottomMid = m.BottomRight = 1;
Bitmap b1 = m.Convolute((Bitmap)b.Clone());
// -1 0 1
// -1 0 1
// -1 0 1
m.Init(0);
m.TopLeft = m.MidLeft = m.BottomLeft = -1;
m.TopRight = m.MidRight = m.BottomRight = 1;
Bitmap b2 = m.Convolute((Bitmap)b.Clone());
// -1 -1 0
// -1 0 1
// 0 1 1
m.Init(0);
m.TopLeft = m.MidLeft = m.TopMid = -1;
m.BottomMid = m.BottomRight = m.MidRight = 1;
Bitmap b3 = m.Convolute((Bitmap)b.Clone());
// 0 1 1
// -1 0 1
// -1 -1 0
m.Init(0);
m.TopMid = m.TopRight = m.MidRight = 1;
m.MidLeft = m.BottomLeft = m.BottomMid = -1;
Bitmap b4 = m.Convolute((Bitmap)b.Clone());
// 梯度运算
b = Gradient(Gradient(b1, b2), Gradient(b3, b4));
b1.Dispose(); b2.Dispose(); b3.Dispose(); b4.Dispose();
return b;
} // end of Prewitt
分享:
评论 (0)