Click here to Skip to main content
Rate this: bad
good
Please Sign up or sign in to vote.
See more: C# GDI+ graphics Algorithms , +
I am bit confused how to calculate dx and dy in sobel edge detection method ....
I googled it and i found that.......
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 5-Nov-12 20:42pm
v2

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

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[^]
  Permalink  

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

  Print Answers RSS
0 OriginalGriff 384
1 Maciej Los 290
2 Sergey Alexandrovich Kryukov 230
3 CPallini 170
4 Shweta N Mishra 165
0 OriginalGriff 7,760
1 Sergey Alexandrovich Kryukov 7,072
2 DamithSL 5,604
3 Manas Bhardwaj 4,986
4 Maciej Los 4,785


Advertise | Privacy | Mobile
Web02 | 2.8.1411023.1 | Last Updated 11 Nov 2012
Copyright © CodeProject, 1999-2014
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100