private void обрезатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (CurrResume != Resume.Cutting)
                return;

            // сохраняем отступ по которому будет обрезание изображения
            _offset.X += trbLeftPosition.Value;
            _offset.Y += trbUpPosition.Value;

            // определяем позицию текущего изображения на форме
            int pos = _images.IndexOf(_currImage);

            // обрезаем изображение на форме
            _images[pos] = CutBitmapImage(_images[pos], trbLeftPosition.Value, trbRightPosition.Value, trbUpPosition.Value, trbDownPosition.Value);

            Segmentation segmentationOrigin = new Segmentation(GetCorrectedPoints(), trbToleranceLimit.Value);
            byte[,,] originMas = segmentationOrigin.GetSegmentedMass(_images[pos]);

            SuperImposition superImposition = new SuperImposition(originMas);
            Segmentation segmentation = new Segmentation(_keyPoints, trbToleranceLimit.Value);
            for (int i = 0; i < _images.Count; i++)
            {
                if (i == pos)
                    continue;

                byte[, ,] currMas = segmentation.GetSegmentedMass(_images[i]);
                Point offset = superImposition.FindBestImposition(currMas, new Point(trbLeftPosition.Value, trbUpPosition.Value));
                _images[i] = CutBitmapImage(_images[i], offset, _images[pos].Width, _images[pos].Height);
            }

            _currImage = _images[pos];
            pbGoodChipImage.Image = _currImage;

            // сбрасываем показания контролов
            trbRightPosition.Value = 0;
            trbLeftPosition.Value = 0;
            trbUpPosition.Value = 0;
            trbDownPosition.Value = 0;
            RefreshCuttingLabels();
            SetDimensionsOfPositionTrackBars(_currImage);
        }
        /// <summary>
        /// Конструктор принимает объект проекта отбраковки
        /// </summary>
        /// <param name="cullingProject">Ссылка на объект проекта отбраковки</param>
        /// <param name="islandLimit">Минимальный размер островка несоответствующих пикселей, которые не игнорируются</param>
        /// <param name="sumIslandLimit">Максимальный размер суммы пикселей в неигнорируемых островках, при котором чип считается годным</param>
        public VisualInspect(CullingProject cullingProject, int islandLimit, int sumIslandLimit)
        {
            _islandLimit = islandLimit;
            _sumIslandLimit = sumIslandLimit;

            // сохраняем проект отбраковки
            _cullingProject = cullingProject;

            // сохраняем сегментированное изображение годного чипа
            _segmentedMassGoodChip = cullingProject.UnitedImage;

            // находим края изображения годного чипа
            EdgeFinder edgeFinder = new EdgeFinder(_segmentedMassGoodChip);
            _edgeNearAreaMas = edgeFinder.GetEdgeNearArea(EdgeRadius);

            // фиксируем размеры массива
            _heightOfGood = _segmentedMassGoodChip.GetUpperBound(0) + 1;
            _widthOfGood = _segmentedMassGoodChip.GetUpperBound(1) + 1;

            // создаем объект для нахождения лучшего совмещения
            _superImposition = new SuperImposition(_segmentedMassGoodChip)
            {
                AcceptablePercent = ImpositionAcceptablePercent
            };
        }