/// <summary> /// Smoothing Black-White picture. /// </summary> /// <param name="pic">Picture.</param> /// <param name="type">Type of smootthing.</param> /// <param name="matrixSize">Size of matrix of smooth.</param> /// <returns>Smoothed picture.</returns> public static Bitmap SmoothBWPicture(this Bitmap pic, SmoothMatrixType type, int matrixSize) { double[,] matrix = new double[matrixSize, matrixSize]; // Calculate matrix of smooth switch (type) { case SmoothMatrixType.Simple: { double temp = 1.0 / (matrixSize * matrixSize); for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { matrix[i, j] = temp; } } break; } case SmoothMatrixType.Gauss: { //TODO doesn't work // calculate discret gauss matrix double div = 0; for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { matrix[i, j] = GaussCoeff(i, j, 1); div += matrix[i, j] * matrix[i, j]; } } // norm matrix for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixSize; j++) { matrix[i, j] /= div; } } break; } } // Smooth pitcture Bitmap result = SmoothingBW(pic, matrix); return(result); }
public Bitmap CannyProcessing(SmoothMatrixType type, int size) { Invoke(new Action(() => StateLbl.Text = "Начато преобразование")); var bitmap = new Bitmap(originalPic, 64, 64).GetBWPicture(); Invoke(new Action(() => { StateLbl.Text = "Получено чернобелое изображение"; resultPicBox.Image = bitmap; UpdateForm(); })); var smoothedBWPicture = bitmap.SmoothBWPicture(type, size); Invoke(new Action(() => { StateLbl.Text = "Получено размытое изображение"; resultPic = bitmap; UpdateForm(); })); var gradients = smoothedBWPicture.FindGradients(); Invoke(new Action(() => { StateLbl.Text = "Найдены градиенты"; StateLbl.Refresh(); })); var gradientsWithSuppressedMaximums = gradients.SuppressMaximums(); Invoke(new Action(() => { StateLbl.Text = "Удалены немаксимумы"; StateLbl.Refresh(); })); var cuttedGradients = gradientsWithSuppressedMaximums.BlackEdge(size / 2 + 1); Invoke(new Action(() => { StateLbl.Text = "Закрашены края"; StateLbl.Refresh(); })); var filteredGradients = cuttedGradients;//.Filtering(); //Invoke(new Action(() => //{ // StateLbl.Text = "Произведена фильтрация. Готово!"; // StateLbl.Refresh(); //})); //Invoke(new Action(() => //{ // StateLbl.Text = "Нейросеть вычисляет есть ли человек на фотографии!"; // StateLbl.Refresh(); // BNPNet net = new BNPNet(@"C:\Users\vladb\Desktop\somaset\network.json"); // var output = net.GetResult(filteredGradients.LengthsToArray().ToVector()); // StateLbl.Text = "Человек " + ((1 - output[0]) < 0.2 ? "присутствует" : "отсутствует") + " на фотографии"; // StateLbl.Refresh(); //})); return(filteredGradients.ToBitmap()); }