Click here to Skip to main content
15,896,527 members

How to calculate dx and dy in sobel edge detection in 5X5 matrix?

govindaAlwani asked:

Open original thread
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....
Tags: C#, GDI+, Graphics, Algorithms, Drawing

Plain Text
ASM
ASP
ASP.NET
BASIC
BAT
C#
C++
COBOL
CoffeeScript
CSS
Dart
dbase
F#
FORTRAN
HTML
Java
Javascript
Kotlin
Lua
MIDL
MSIL
ObjectiveC
Pascal
PERL
PHP
PowerShell
Python
Razor
Ruby
Scala
Shell
SLN
SQL
Swift
T4
Terminal
TypeScript
VB
VBScript
XML
YAML

Preview



When answering a question please:
  1. Read the question carefully.
  2. Understand that English isn't everyone's first language so be lenient of bad spelling and grammar.
  3. If a question is poorly phrased then either ask for clarification, ignore it, or edit the question and fix the problem. Insults are not welcome.
  4. Don't tell someone to read the manual. Chances are they have and don't get it. Provide an answer or move on to the next question.
Let's work to help developers, not make them feel stupid.
Please note that all posts will be submitted under the http://www.codeproject.com/info/cpol10.aspx.



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