【问题标题】:How to calculate dx and dy in sobel edge detection in 5X5 matrix?如何计算 5X5 矩阵中 sobel 边缘检测中的 dx 和 dy?
【发布时间】:2012-11-06 06:34:03
【问题描述】:

我有点困惑如何在 sobel 边缘检测方法中计算 dx 和 dy .... 我用谷歌搜索了它,我发现......。

  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();
    }
}

这是针对 3X3 矩阵的............我想实现 5X5 矩阵............ 其实我想要切线斜率到选定的点。 . . .切线 = Atan2(dx,dy)。 使用 3X3 矩阵,我得到了正确的切线,但不是更准确的切线。 我对计算 5X5 矩阵的 dx 和 dy 感兴趣。我不想检测边缘,我想检测 Atan2(dx,dy)........ 请帮帮我....

【问题讨论】:

    标签: c# algorithm graphics core-graphics graph-algorithm


    【解决方案1】:

    用于垂直方向的英特尔性能基元 (IPP) 中的 Sobel 5x5 矩阵内核(水平方向旋转):

    1   4   6   4   1
    2   8  12   8   2
    0   0   0   0   0
    -2  -8 -12  -8  -2
    -1  -4  -6  -4  -1
    

    并注意 Atan2 函数参数顺序:Atan2(y, x)

    【讨论】:

    • 我知道那个矩阵.....假设 double theta = atan2(y,x);那么切线的天使将等于theta还是90-theta? @MBo
    • Atan2 给出了梯度向量的角度。如果您的意思是与轮廓线(等值线)相切 - 是的,它垂直于梯度,90-theta
    • 在这个算法中我没有得到水平线和垂直线......
    • 除水平和垂直外,您是否获得了所有其他方向?
    • 实际上我想在绘制的形状内绘制一个形状......所以对于水平和垂直线我没有得到线......
    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多