/* * Функция-обработчик изменения преобразования для изображения */ private void OnCheckChangedEventHandler(object sender, EventArgs e) { if (picSource.BackgroundImage != null) { SetSettings(false); //Настроить интерфейс для выбранного преобразования изображения Bitmap bitmap = (Bitmap)picOutput.BackgroundImage; //Получить изображение для обработки if (cmbEdgeDetection.SelectedIndex == 0) //Если преобразование не выбрано { picResult.BackgroundImage = null; //Не отображать результирующее изображение } else if (cmbEdgeDetection.SelectedIndex == 1) //Если выбран модуль градиента { picResult.BackgroundImage = bitmap.GradientModule(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 2) //Если выбран градиент Робертса { picResult.BackgroundImage = bitmap.RobertsCrossFilter(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 3) //Если выбрано преобразование вида ∇I = |I(i,j) - I(i+1,j)| + |I(i,j) - I(i,j+1)| { picResult.BackgroundImage = bitmap.EdgeDetectionFilter1(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 4) //Если выбрано преобразование вида ∇I = max(|I(i,j) - I(i+1,j)| , |I(i,j) - I(i,j+1)|) { picResult.BackgroundImage = bitmap.EdgeDetectionFilter2(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 5) //Если выбрано преобразование вида ∇I = |I(i,j) - I(i+1,j+1)| + |I(i+1,j) - I(i,j+1)| { picResult.BackgroundImage = bitmap.EdgeDetectionFilter3(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 6) //Если выбрано преобразование вида ∇I = Σ|I(i,j) - I(i+k,j+L)| { picResult.BackgroundImage = bitmap.EdgeDetectionFilter4(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 7) //Если выбрано преобразование вида ∇I = max |I(i,j) - I(i+k,j+L)| { picResult.BackgroundImage = bitmap.EdgeDetectionFilter5(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 8) //Если выбрана аппроксимация по оси X { int c = 0; //Переменная для хранения значения "с" double divider = 0; //Переменная для хранения делителя маски фильтра bool result = Int32.TryParse(txbCValue.Text, out c); //Попытка преобразовать, введенное пользователем значение "c", в целое число if (result && (c >= 1) && (c <= 10)) //Если преобразование прошло успешно и значение "c" входит в диапазон [1, 2,...,10] { txbCValue.BackColor = Color.White; //Устанавить белый фон в поле ввода значения "c" double[,] matrix = { { 1, 0, -1, }, { c, 0, -c, }, { 1, 0, -1, }, }; //Определить маску для аппроксимации for (int i = 0; i < dgvMask.Rows.Count; i++) //Вывести маску на экран { for (int j = 0; j < dgvMask.Columns.Count; j++) { dgvMask[i, j].Value = matrix[i, j]; } } divider = Matrix.GetMatrixElementsSum(matrix); //Определить делитель маски if (divider == 0) //Если делитель навен 0 { divider++; //Увеличить делитель на 1 txbSettingsDivider.Text = divider.ToString(); //Вывести делитель на экран } else { txbSettingsDivider.Text = divider.ToString(); //Вывести делитель на экран } picResult.BackgroundImage = bitmap.Approximation(matrix, 1.0 / divider); //Применить аппроксимацию к изображению } else { txbCValue.BackColor = Color.Red; //Устанавить красный фон в поле ввода значения "c" picResult.BackgroundImage = null; //Не выводить результирующее изображение на экран if (txbCValue.Text == "") //Если поле ввода значения "c" пустое { txbCValue.BackColor = Color.White; //Устанавить белый фон в поле ввода значения "c" } } } else if (cmbEdgeDetection.SelectedIndex == 9) //если выбрана аппроксимация по оси Y { int c = 0; //Переменная для хранения значения "с" double divider = 0; //Переменная для хранения делителя маски фильтра bool result = Int32.TryParse(txbCValue.Text, out c); //Попытка преобразовать, введенное пользователем значение "c", в целое число if (result && (c >= 1) && (c <= 10)) //Если преобразование прошло успешно и значение "c" входит в диапазон [1, 2,...,10] { txbCValue.BackColor = Color.White; //Устанавить белый фон в поле ввода значения "c" double[,] matrix = { { -1, -c, -1, }, { 0, 0, 0, }, { 1, c, 1, }, }; //Определить маску для аппроксимации for (int i = 0; i < dgvMask.Rows.Count; i++) //Вывести маску на экран { for (int j = 0; j < dgvMask.Columns.Count; j++) { dgvMask[i, j].Value = matrix[i, j]; } } divider = Matrix.GetMatrixElementsSum(matrix); //Определить делитель маски if (divider == 0) //Если делитель навен 0 { divider++; //Увеличить делитель на 1 txbSettingsDivider.Text = divider.ToString(); //Вывести делитель на экран } else { txbSettingsDivider.Text = divider.ToString(); //Вывести делитель на экран } picResult.BackgroundImage = bitmap.Approximation(matrix, 1.0 / divider); //Применить аппроксимацию к изображению } else { txbCValue.BackColor = Color.Red; //Устанавить красный фон в поле ввода значения "c" picResult.BackgroundImage = null; //Не выводить результирующее изображение на экран if (txbCValue.Text == "") //Если поле ввода значения "c" пустое { txbCValue.BackColor = Color.White; //Устанавить белый фон в поле ввода значения "c" } } } else if (cmbEdgeDetection.SelectedIndex == 10) //Если выбрано повышение резкости 1 { picResult.BackgroundImage = bitmap.Sharpness1(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 11) //Если выбрано повышение резкости 2 { picResult.BackgroundImage = bitmap.Sharpness2(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 12) //Если выбрано повышение резкости 3 { picResult.BackgroundImage = bitmap.Sharpness3(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 13) //Если выбрано повышение резкости 4 { picResult.BackgroundImage = bitmap.Sharpness4(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 14) //Если выбрано согласование с плоскостью в окне 2x2 { picResult.BackgroundImage = bitmap.PlaneMatchingIn2x2Window(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 15) //Если выбран оператор Превитта { picResult.BackgroundImage = bitmap.PrewittFilter(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 16) //Если выбрана маска согласования с поверхностью второго порядка для оператора Лапласа { picResult.BackgroundImage = bitmap.LaplacianSecondOrderPlaneMatching(); //Применить её к изображению } else if (cmbEdgeDetection.SelectedIndex == 17) //Если выбран Лапласиан Гауссиана в окне 5x5 { picResult.BackgroundImage = bitmap.Laplacian5x5OfGaussian5x5Filter1(); //Применить его к изображению } else if (cmbEdgeDetection.SelectedIndex == 18) //Если выбрана проверка точки на локальный максимум в окне 3x3 { picResult.BackgroundImage = bitmap.LocalMaximum3x3(); //Применить её к изображению } else if (cmbEdgeDetection.SelectedIndex == 19) //Если выбрана проверка точки на локальный максимум по оси X { picResult.BackgroundImage = bitmap.LocalMaximumX(); //Применить её к изображению } else if (cmbEdgeDetection.SelectedIndex == 20) //Если выбрана проверка точки на локальный максимум по оси Y { picResult.BackgroundImage = bitmap.LocalMaximumY(); //Применить её к изображению } } }