Click here to Skip to main content
15,867,308 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I am bit confused how to calculate dx and dy in sobel edge detection method ....
I googled it and i found that.......
C#
public class SobelEdgeDetector : ImageFilter<SobelEdgeDetectorParms>
    {
       private Color grayscale(Color cr)
        {
            return Color.FromArgb(cr.A, (int)(cr.R * .3 + cr.G * .59 + cr.B * 0.11),
                (int)(cr.R * .3 + cr.G * .59 + cr.B * 0.11),
                (int)(cr.R * .3 + cr.G * .59 + cr.B * 0.11));
        }
        public override Bitmap FilterProcessImage(SobelEdgeDetectorParms parms, Bitmap image)
        {
            Bitmap ret = new Bitmap(image.Width, image.Height);
            for (int i = 1; i < image.Width - 1; i++)
            {
                for (int j = 1; j < image.Height - 1; j++)
                {
                    Color cr = image.GetPixel(i + 1, j);
                    Color cl = image.GetPixel(i - 1, j);
                    Color cu = image.GetPixel(i, j - 1);
                    Color cd = image.GetPixel(i, j + 1);
                    Color cld = image.GetPixel(i - 1, j + 1);
                    Color clu = image.GetPixel(i - 1, j - 1);
                    Color crd = image.GetPixel(i + 1, j + 1);
                    Color cru = image.GetPixel(i + 1, j - 1);
                    int dx = 0, dy = 0;
                    switch (parms.Channel)
                    {
                        case Channels.R:
                            dx = cld.R + 2 * cd.R + crd.R - (clu.R + 2 * cu.R + cru.R);
                            dy = crd.R + 2 * cr.R + cru.R - (cld.R + 2 * cl.R + clu.R);
                            break;
                        case Channels.G:
                            dx = cld.G + 2 * cd.G + crd.G - (clu.G + 2 * cu.G + cru.G);
                            dy = crd.G + 2 * cr.G + cru.G - (cld.G + 2 * cl.G + clu.G);
                            break;
                        case Channels.B:
                            dx = cld.B + 2 * cd.B + crd.B - (clu.B + 2 * cu.B + cru.B);
                            dy = crd.B + 2 * cr.B + cru.B - (cld.B + 2 * cl.B + clu.B);
                            break;
                        case Channels.RGB:
                            dx = grayscale(cld).B + 2 * grayscale(cd).B + grayscale(crd).B - (grayscale(clu).B + 2 * grayscale(cu).B + grayscale(cru).B);
                            dy = grayscale(crd).B + 2 * grayscale(cr).B + grayscale(cru).B - (grayscale(cld).B + 2 * grayscale(cl).B + grayscale(clu).B);
                            break;
                    }
                    double power = Math.Abs(dx) + Math.Abs(dy);
                    if (power > parms.Threshold)
                        ret.SetPixel(i, j, parms.EdgeColor);
                    else
                    {
                        if (parms.CopyOriginal)
                        {
                            Color c = image.GetPixel(i, j);
                            if (parms.ConvertToGrayscale)
                            {
                                ret.SetPixel(i, j,
                                    Color.FromArgb(255,
                                    (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11),
                                    (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11),
                                    (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11)));
                            }
                            else
                                ret.SetPixel(i, j, c);
                        }
                        else
                            ret.SetPixel(i, j, Color.White);
                    }
                }
            }
            return ret;
        }
        public override System.Windows.Forms.Control GetParameterWindow()
        {
            return new SobelEdgeDetectorParmForm();
        }
    }

this is for 3X3 Matrix .........I want to implement 5X5 Matrix..........
Actually I want slop of tangent line to selected point. . . .
tangent= Atan2(dx,dy).
Using 3X3 matrix i am getting correct tangent, but it not more accurate tangent.
I am interested in calculation of dx and dy for 5X5 matrix. I don't want to detect edge, i want to detect tangent that is Atan2(dx,dy)........
Please help me....
Posted
v2

1 solution

You can use the coefficients from this source to compute dx and dy: http://www.cim.mcgill.ca/~image529/TA529/Image529_99/assignments/edge_detection/references/sobel.htm[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900