1: public static Bitmap SobelEdgeDetection(Bitmap Input)
2:
3: {
4:
5: try
6:
7: {
8:
9: using (Bitmap TempImage = ConvertBlackAndWhite(Input))
10:
11: {
12:
13: Filter TempFilter = new Filter(3, 3);
14:
15: TempFilter.MyFilter[0, 0] = -1;
16:
17: TempFilter.MyFilter[0, 1] = 0;
18:
19: TempFilter.MyFilter[0, 2] = 1;
20:
21: TempFilter.MyFilter[1, 0] = -2;
22:
23: TempFilter.MyFilter[1, 1] = 0;
24:
25: TempFilter.MyFilter[1, 2] = 2;
26:
27: TempFilter.MyFilter[2, 0] = -1;
28:
29: TempFilter.MyFilter[2, 1] = 0;
30:
31: TempFilter.MyFilter[2, 2] = 1;
32:
33: TempFilter.Absolute = true;
34:
35: using (Bitmap TempImageX = TempFilter.ApplyFilter(TempImage))
36:
37: {
38:
39: TempFilter = new Filter(3, 3);
40:
41: TempFilter.MyFilter[0, 0] = 1;
42:
43: TempFilter.MyFilter[0, 1] = 2;
44:
45: TempFilter.MyFilter[0, 2] = 1;
46:
47: TempFilter.MyFilter[1, 0] = 0;
48:
49: TempFilter.MyFilter[1, 1] = 0;
50:
51: TempFilter.MyFilter[1, 2] = 0;
52:
53: TempFilter.MyFilter[2, 0] = -1;
54:
55: TempFilter.MyFilter[2, 1] = -2;
56:
57: TempFilter.MyFilter[2, 2] = -1;
58:
59: TempFilter.Absolute = true;
60:
61: using (Bitmap TempImageY = TempFilter.ApplyFilter(TempImage))
62:
63: {
64:
65: using (Bitmap NewBitmap = new Bitmap(TempImage.Width, TempImage.Height))
66:
67: {
68:
69: BitmapData NewData = Image.LockImage(NewBitmap);
70:
71: BitmapData OldData1 = Image.LockImage(TempImageX);
72:
73: BitmapData OldData2 = Image.LockImage(TempImageY);
74:
75: int NewPixelSize = Image.GetPixelSize(NewData);
76:
77: int OldPixelSize1 = Image.GetPixelSize(OldData1);
78:
79: int OldPixelSize2 = Image.GetPixelSize(OldData2);
80:
81: for (int x = 0; x < NewBitmap.Width; ++x)
82:
83: {
84:
85: for (int y = 0; y < NewBitmap.Height; ++y)
86:
87: {
88:
89: Color Pixel1 = Image.GetPixel(OldData1, x, y, OldPixelSize1);
90:
91: Color Pixel2 = Image.GetPixel(OldData2, x, y, OldPixelSize2);
92:
93: Image.SetPixel(NewData, x, y,
94:
95: Color.FromArgb(Math.MathHelper.Clamp(Pixel1.R + Pixel2.R, 255, 0),
96:
97: Math.MathHelper.Clamp(Pixel1.G + Pixel2.G, 255, 0),
98:
99: Math.MathHelper.Clamp(Pixel1.B + Pixel2.B, 255, 0)),
100:
101: NewPixelSize);
102:
103: }
104:
105: }
106:
107: Image.UnlockImage(NewBitmap, NewData);
108:
109: Image.UnlockImage(TempImageX, OldData1);
110:
111: Image.UnlockImage(TempImageY, OldData2);
112:
113: return Image.Negative(NewBitmap);
114:
115: }
116:
117: }
118:
119: }
120:
121: }
122:
123: }
124:
125: catch { throw; }
126:
127: }