/*
         * Функция-обработчик изменения преобразования для изображения
         */
        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();                     //Применить её к изображению
                }
            }
        }