В чем разница между двумя результатами ниже? - PullRequest
0 голосов
/ 28 октября 2019

Я использовал оператор Собеля, чтобы отделить край от изображения в градациях серого. И мой результат отличается от результата моего учителя. Его результат имеет несколько белых пикселей, как шум, мой результат не похож на его результат. [1] Мой результат: https://imgur.com/a/IgacsAx [2] Результат моего учителя: https://imgur.com/RysHIwc

public Bitmap Edge_Detect(Bitmap gray_image, int D0)
        {
            //sobel gx
            int[,] mask_x = new int[3, 3];
            mask_x[0, 0] = -1;      mask_x[1, 0] = -2;      mask_x[2, 0] = -1;
            mask_x[0, 1] =  0;      mask_x[1, 1] =  0;      mask_x[2, 1] =  0;
            mask_x[0, 2] =  1;      mask_x[1, 2] =  2;      mask_x[2, 2] =  1;
            //sobel gy
            int[,] mask_y = new int[3, 3];
            mask_y[0, 0] = -1;      mask_y[1, 0] = 0;       mask_y[2, 0] = 1;
            mask_y[0, 1] = -2;      mask_y[1, 1] = 0;       mask_y[2, 1] = 2;
            mask_y[0, 2] = -1;      mask_y[1, 2] = 0;       mask_y[2, 2] = 1;

            Bitmap edge = new Bitmap(gray_image.Width, gray_image.Height);

            for (int x = 1; x < gray_image.Width - 1; x++)
                for (int y = 1; y < gray_image.Height - 1; y++)
                {
                    int gx = 0;
                    int gy = 0;
                    int Mxy = 0;
                    for (int i = x - 1; i <= x + 1; i++)
                        for (int j = y - 1; j <= y + 1; j++)
                        {
                            Color color = gray_image.GetPixel(i, j);
                            byte value = color.R;
                            gx += value * mask_x[i - (x - 1), j - (y - 1)];
                            gy += value * mask_y[i - (x - 1), j - (y - 1)];
                        }
                    Mxy = Math.Abs(gx) + Math.Abs(gy);
                  //D0 is threshold value
                    if (Mxy<=D0)
                        edge.SetPixel(x, y, Color.FromArgb(0, 0, 0));
                    else if (Mxy > D0)
                    {
                        Mxy = Math.Min(255, Mxy);
                        edge.SetPixel(x, y, Color.FromArgb((byte)Mxy,(byte) Mxy,(byte) Mxy));
                    }
                }

            return edge;
        }
...