Harris Corner Detection突出显示所有边缘而非角落

时间:2017-03-10 17:45:04

标签: c# image-processing machine-learning computer-vision

我需要实现Harris角点检测,它应该只有正 R 值。如果我使用R>0的阈值,则会突出显示任何内容,如果R < 0,则从-0.00001-1000000,它会输出完美的边缘检测,但不会产生任何角落。

输入输出: http://imgur.com/a/TtQSD \

主要代码:

 Bitmap b = (Bitmap)pictureBox1.Image;
 var i = IntensityMat(b);
 var n = Mask(i,-0.00000001);
 var ty = ToBit(n);
 pictureBox1.Image = ty;

功能:

    public double Intensity(Color c)
    {
        int x = c.R;
        int y = c.G;
        int z = c.B;
        return Math.Sqrt(x * x + y * y + z * z);
    }

    public double Trace(double[,] m)
    {
        double sum = 0;

        for (int i = 0; i < m.GetLength(0); i++)
        {
            sum += m[i, i];
        }

        return sum;
    }

    public double[,] M(double ix,double iy)
    {
        double[,] m = new double[2, 2];

        m[0, 0] = ix*ix;
        m[1, 1] = iy*iy;
        m[0, 1] = ix * iy;
        m[1, 0] = ix * iy;

        return m;
    }

    public double Det(double[,] m)
    {
        return m[1, 1] * m[0, 0] - m[0, 1] * m[1, 0];
    }

    public double R(double[,] m,double k=0.04)
    {
        var t = Trace(m);
        return Det(m) - k * t * t;
    }

    int[,] IntensityMat(Bitmap b)
    {
        int[,] n = new int[b.Width, b.Height];

        for (int i = 0; i < b.Width; i++)
        {
            for (int j = 0; j < b.Height; j++)
            {
                Color c = b.GetPixel(i, j);
                n[i, j] = (int)Intensity(c);
            }
        }

        return n;
    }

    Bitmap ToBit(int[,] bd)
    {
        Bitmap b = new Bitmap(bd.GetLength(0), bd.GetLength(1));
        for (int i = 0; i < b.Width; i++)
        {
            for (int j = 0; j < b.Height; j++)
            {
                var t = bd[i, j];
                b.SetPixel(i, j, Color.FromArgb(t, t, t));
            }
        }

        return b;
    }

    int[,] Mask(int[,] m,double thresh)// m matrix of I
    {
        int[,] n = new int[m.GetLength(0), m.GetLength(1)];

        for (int i = 1; i < m.GetLength(0); i++)
        {
            for (int j = 1; j < m.GetLength(1); j++)
            {
                double ix = Math.Abs(m[i-1,j]-m[i,j]);
                double iy = Math.Abs(m[i , j-1] - m[i, j]);

                var lap = M(ix, iy);
                var r = R(lap);

                if (r > thresh)
                {
                    n[i, j] = 255;
                }
            }
        }

        return n;
    }

0 个答案:

没有答案