private ZArrayDescriptor BW_Line(int nx, int ny, int kv) // Ч/Б полосы с заданным числом градаций { int nx1 = nx + dx * 2; ZArrayDescriptor cmpl = new ZArrayDescriptor(nx1, ny); int step = nx / kv; for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { if ((i / step) % 2 == 0) { cmpl.array[i + dx, j] = 0; } else { cmpl.array[i + dx, j] = 255; } } } cmpl = Model_Sinus.Intens(255, 0, dx, cmpl); // Белая и черная полоса по краям return(cmpl); }
/// <summary> /// Клин с 16 значениями интенсивности из массива /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button6_Click(object sender, EventArgs e) { k12 = Convert.ToInt32(textBox8.Text); nx = Convert.ToInt32(textBox14.Text); // Текущий размер ny = Convert.ToInt32(textBox15.Text); double[] am = new double[nx]; //for (int i = 0; i < nx; i++) { am[i] = cl[i / 256]; } // строка клина 128 - 0-31 256 - 0-15 kv = Convert.ToInt32(textBox16.Text); // Число градаций am = Clin(cl, kv, nx); // Формирование клина if (am == null) { MessageBox.Show("kv != 16, 32, 64, 128 kv= " + kv); return; } int Nx1 = nx + dx * 2; ZArrayDescriptor cmpl = new ZArrayDescriptor(Nx1, ny); // ----------------------------------------------------------------------------------- Клин for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { cmpl.array[i + dx, j] = am[i]; } } cmpl = Model_Sinus.Intens(255, 0, dx, cmpl); // Белая и черная полоса по краям Form1.zArrayDescriptor[k12 - 1] = cmpl; VisualRegImage(k12 - 1); // ----------------------------------------------------------------------------------- Обратный клин // ZArrayDescriptor cmpl1 = new ZArrayDescriptor(Nx1, ny); // for (int i = 0; i < nx; i++) // for (int j = 0; j < ny; j++) // { cmpl1.array[i + dx, j] = am[nx-1-i]; } // cmpl1 = Model_Sinus.Intens(0, 256, dx, cmpl1); // Белая и черная полоса по краям // Form1.zArrayDescriptor[k12 - 1 + 1] = cmpl1; // VisualRegImage(k12 - 1 + 1); }
private ZArrayDescriptor Bright(int nx, int ny, int c) // Однотонный цвет { int nx1 = nx + dx * 2; ZArrayDescriptor cmpl = new ZArrayDescriptor(nx1, ny); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { cmpl.array[i + dx, j] = c; } } cmpl = Model_Sinus.Intens(255, 0, dx, cmpl); // Белая и черная полоса по краям return(cmpl); }
/// <summary> /// Автоматическое определение клина /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button15_Click(object sender, EventArgs e) { int nx = 3096; int ny = 2160; int nx1 = nx + dx * 2; // Размер для изображения с добавленными полосами int kv = 16; // Число градаций Form1.zArrayDescriptor[0] = Model_Sinus.Intensity1(255, nx, ny, dx, 1); // Идеальная интенсивностсть => 1 VisualRegImage(0); TakePhoto12(); VisualRegImage(1); DialogResult dialogResult = MessageBox.Show("Заданы границы X0, X1, X2, X3 ?", "Ограничение по размеру", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.No) { return; } Form1.Coords[] X = MainForm.GetCoordinates(); Form1.zArrayDescriptor[6] = File_Change_Size.Change_rectangle(Form1.zArrayDescriptor[1], X); // Ограничение по размеру 2 => 7 Form1.zArrayDescriptor[6] = SumClass.Sum_zArrayY_ALL(Form1.zArrayDescriptor[6]); // Суммирование по Y 7 => 7 VisualRegImage(6); int nx2 = Form1.zArrayDescriptor[6].width; // Размер массива после ограничения int ny2 = Form1.zArrayDescriptor[6].height; int N_Line = ny2 / 2; // Линия по центральной строке //---------------------------------------------------------------------------------------------- Идеальный клин без ввода с новыми размерами Form1.zArrayDescriptor[0] = Model_Sinus.Intensity1(255, nx2, ny2, dx, 1); Form1.zArrayDescriptor[1] = Minus100(Form1.zArrayDescriptor[0], 100); VisualRegImage(1); double[] am_Clin_Ideal = new double[nx2]; // Идеальный клин от 0 до 255 for (int i = 0; i < nx2; i++) { am_Clin_Ideal[i] = Form1.zArrayDescriptor[1].array[i, N_Line]; } double[] am_Clin = new double[nx2]; // Отклик от идеального клина от 0 до 255 for (int i = 0; i < nx2; i++) { am_Clin[i] = Form1.zArrayDescriptor[6].array[i, N_Line]; } //---------------------------------------------------------------------------------------------- Черно белые полосы => 0 Form1.zArrayDescriptor[0] = BW_Line(nx, ny, kv); // Полосы с kv градациями VisualRegImage(0); TakePhoto12(); //---------------------------- Фото => 1 MessageBox.Show("Ч/Б полосы введены"); Form1.zArrayDescriptor[3] = File_Change_Size.Change_rectangle(Form1.zArrayDescriptor[1], X); //----------------- Ограничение по размеру => 2 VisualRegImage(3); Form1.zArrayDescriptor[3] = SumClass.Sum_zArrayY_ALL(Form1.zArrayDescriptor[3]); Form1.zArrayDescriptor[4] = BW_Line_255(Form1.zArrayDescriptor[3], 210); // --------------Выше порога 255 ниже 0 VisualRegImage(4); double[] am_BW = BW_Num(Form1.zArrayDescriptor[4], N_Line); // размер новый после прямоугольного ограничения //---------------------------------------------------------------------------------------------- Определение нового клина double[] cl1 = NewClin(am_Clin, am_BW, am_Clin_Ideal); //----------------------------------------------------------------------------------------------Отображение нового клина ZArrayDescriptor cmpl = new ZArrayDescriptor(nx1, ny); double[] am = Clin(cl1, kv, nx); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { cmpl.array[i + dx, j] = am[i]; } // ----------------- Клин в рабочий массив } cmpl = Model_Sinus.Intens(255, 0, dx, cmpl); // Белая и черная полоса по краям Form1.zArrayDescriptor[7] = cmpl; // новый клин в 7 массив VisualRegImage(7); for (int i = 0; i < 16; i++) { cl[i] = cl1[i]; } }
//------------------------------------------------------------------------------------------------------------------- /// <summary> /// Ввод клина с камеры и обработка с усреднением /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button12_Click(object sender, EventArgs e) { int nx = 3996; int ny = 2160; int nx1 = nx + dx * 2; // Размер для изображения с добавленными полосами int kv = 16; // Число градаций // -------------------------------------------------------------------------------------------- Клин => 0 (16 градаций) double[] am = Clin(cl, kv, nx); // Формирование клина ZArrayDescriptor cmpl = new ZArrayDescriptor(nx1, ny); for (int i = 0; i < nx; i++) { for (int j = 0; j < ny; j++) { cmpl.array[i + dx, j] = am[i]; } // ----------------- Клин } cmpl = Model_Sinus.Intens(255, 0, dx, cmpl); // Белая и черная полоса по краям Form1.zArrayDescriptor[0] = cmpl; // Клин в 1 массив VisualRegImage(0); TakePhoto12(); //-------- Фото => 1 DialogResult dialogResult = MessageBox.Show("Заданы границы X0, X1, X2, X3 ?", "Ограничение по размеру", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.No) { return; } Form1.Coords[] X = MainForm.GetCoordinates(); //MessageBox.Show(" X1 - " + Form1.X1 + " Y1 - " + Form1.Y1); //---------------------------------------------------------------------------------------------- Ограничение клина по размеру => 2 Form1.zArrayDescriptor[2] = File_Change_Size.Change_rectangle(Form1.zArrayDescriptor[1], X); VisualRegImage(2); //MessageBox.Show("Ограничение клина по размеру прошло"); int nx2 = Form1.zArrayDescriptor[2].width; // Размер массива после ограничения int ny2 = Form1.zArrayDescriptor[2].height; int N_Line = ny2 / 2; // Полоса по центру //int y1 = File_Change_Size.MinY(X); // Минимальное значение по Y //int y2 = File_Change_Size.MaxY(X); // Максимальное значение по Y Form1.zArrayDescriptor[2] = SumClass.Sum_zArrayY_ALL(Form1.zArrayDescriptor[2]); //------------------------- Усреднение по Y => 2 VisualRegImage(2); //MessageBox.Show("Усреднение по Y прошло"); //---------------------------------------------------------------------------------------------- Черно белые полосы => 0 Form1.zArrayDescriptor[0] = BW_Line(nx, ny, kv); // Полосы с kv градациями VisualRegImage(0); TakePhoto12(); //---------------------------- Фото => 1 MessageBox.Show("Полосы введены"); Form1.zArrayDescriptor[3] = File_Change_Size.Change_rectangle(Form1.zArrayDescriptor[1], X); //----------------- Ограничение по размеру => 2 VisualRegImage(3); //Form1.zArrayDescriptor[3] = SumClass.Sum_zArrayY_ALL(Form1.zArrayDescriptor[3]); Form1.zArrayDescriptor[4] = BW_Line_255(Form1.zArrayDescriptor[3], 210); // --------------Выше порога 255 ниже 0 VisualRegImage(4); double[] am_BW = BW_Num(Form1.zArrayDescriptor[4], N_Line); // размер новый после прямоугольного ограничения //MessageBox.Show("Контраст прошло"); //--------------------------------------------------------------------------------------------- Усреднение по X клина => 6 Form1.zArrayDescriptor[5] = Summ_Y(Form1.zArrayDescriptor[2], Form1.zArrayDescriptor[4]); VisualRegImage(5); }