Я использовал оператор Собеля, чтобы отделить край от изображения в градациях серого. И мой результат отличается от результата моего учителя. Его результат имеет несколько белых пикселей, как шум, мой результат не похож на его результат. [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;
}