The Sobel operator is a discrete
differentiation operator, calculating an approximation of the gradient of the
image intensity function. The operator calculates the gradient of the image
intensity at each point, giving the direction of the largest possible increase
from light to dark and the rate of change in that direction. The result
therefore shows how sharply or smoothly the image changes at that
point.
The
operator uses two 3×3 kernels which are convolved with the original image to
calculate approximations of the derivatives - one for vertical changes, and one
for horizontal
Image source
wikipedia
Here Gx
and Gy are the two kernels and A is the original image.
At each point in
the image, the resulting gradient approximations can be combined to give the
gradient magnitude, using:
Image source :wikipedia
Code for sobel filter
namespace sobel
{
class sobel
{
Bitmap b, b1;
public Image apply(Image im)
{
int[,] gx = new int[,] { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } }; // The matrix Gx
int[,] gy = new int[,] { { 1, 2, 1 }, { 0, 0, 0 }, { -1, -2, -1 } }; // The matrix Gy
b = (Bitmap)im;
Bitmap b1 = new Bitmap(im);
for (int i = 1; i < b.Height - 1; i++) // loop for the image pixels height
{
for (int j = 1; j < b.Width - 1; j++) // loop for image pixels width
{
float new_x = 0, new_y = 0;
float c;
for (int hw = -1; hw < 2; hw++) //loop for cov matrix
{
for (int wi = -1; wi < 2; wi++)
{
c =(b.GetPixel(j+wi,i+hw).B +b.GetPixel(j+wi,i+hw).R +b.GetPixel(j+ wi,i+hw).G)/3;
new_x += gx[hw + 1, wi + 1] * c;
new_y += gy[hw + 1, wi + 1] * c;
}
}
if (new_x * new_x + new_y * new_y > 128*128)
b1.SetPixel(j, i, Color.Black);
else
b1.SetPixel(j, i, Color.White);
}
}
return (Image)b1;
}
}
The class takes as input a grayscale image .The code to convert an image to grayscale is
given below if required .
public Image gray(Image Im)
{
Bitmap b = (Bitmap)Im;
for (int i = 1; i < b.Height ; i++) // loop for the image pixels height
{
for (int j = 1; j < b.Width ; j++) // loop for the image pixels width
{
Color col;
col = b.GetPixel(j,i );
b.SetPixel(j , i , Color.FromArgb((col.R + col.G + col.B) / 3, (col.R + col.G + col.B) / 3, (col.R + col.G + col.B) / 3));
}
}
return (Image)b;
}
http://www.eggheadcafe.com/tutorials/aspnet/c833c86a-677a-4ff3-b820-43126cbeb1a7/net-gdi-graphics-edge-d.aspx