/// <summary>
        /// Reset to default values
        /// </summary>
        private void Reset()
        {
            _init = true;

            // boundary settings
            _bndRec         = MokkanExtraction.SearchMokkanRegion(_oriBmp, _imgRec);
            nupLeft.Value   = _bndRec.Left;
            nupRight.Value  = _bndRec.Right;
            nupTop.Value    = _bndRec.Top;
            nupBottom.Value = _bndRec.Bottom;

            // filter settings
            rdbHSL.Checked          = true;
            grbHSL.Enabled          = true;
            rdbYCbCr.Checked        = false;
            grbYCbCr.Enabled        = false;
            rdbThresholding.Checked = false;
            grbThresholding.Enabled = false;
            _hue            = (IntRange)MokkanExtraction.Hue.Clone();
            _sat            = (DoubleRange)MokkanExtraction.Saturation.Clone();
            _lum            = (DoubleRange)MokkanExtraction.Luminance.Clone();
            _y              = (DoubleRange)MokkanExtraction.Y.Clone();
            _cb             = (DoubleRange)MokkanExtraction.Cb.Clone();
            _cr             = (DoubleRange)MokkanExtraction.Cr.Clone();
            slideH.Min      = (int)(_hue.Min * 255 / 359);
            slideH.Max      = (int)(_hue.Max * 255 / 359);
            slideS.Min      = (int)(_sat.Min * 255);
            slideS.Max      = (int)(_sat.Max * 255);
            slideL.Min      = (int)(_lum.Min * 255);
            slideL.Max      = (int)(_lum.Max * 255);
            slideY.Min      = (int)(_y.Min * 255);
            slideY.Max      = (int)(_y.Max * 255);
            slideCb.Min     = (int)((_cb.Min + 0.5) * 255);
            slideCb.Max     = (int)((_cb.Max + 0.5) * 255);
            slideCr.Min     = (int)((_cr.Min + 0.5) * 255);
            slideCr.Max     = (int)((_cr.Max + 0.5) * 255);
            lblHRange.Text  = String.Format("({0}~{1})", _hue.Min, _hue.Max);
            lblSRange.Text  = String.Format("({0:0.00}~{1:0.00})", _sat.Min, _sat.Max);
            lblLRange.Text  = String.Format("({0:0.00}~{1:0.00})", _lum.Min, _lum.Max);
            lblYRange.Text  = String.Format("({0:0.00}~{1:0.00})", _y.Min, _y.Max);
            lblCbRange.Text = String.Format("({0:0.00}~{1:0.00})", _cb.Min, _cb.Max);
            lblCrRange.Text = String.Format("({0:0.00}~{1:0.00})", _cr.Min, _cr.Max);
            cmbThresholding.SelectedIndex = 0;
            grbThreshold.Enabled          = false;

            // threshold setting
            tbThreshold.Value  = MkaDefine.THRESHOLD;
            nupThreshold.Value = MkaDefine.THRESHOLD;

            // auto zoning settings
            nupMokkanNum.Text     = MkaDefine.MOKKAN_NUM.ToString();
            nupMokkanMinArea.Text = MkaDefine.MIN_AREA.ToString();
            nupWidHeiRatio.Text   = MkaDefine.SIZE_RATIO.ToString();
            nupTolerance.Text     = MkaDefine.TOLERANCE.ToString();

            _init = false;

            ChangeBoundary();
        }
        /// <summary>
        /// Change boundary of processing area
        /// </summary>
        private void ChangeBoundary()
        {
            if (_init)
            {
                return;
            }

            this.Cursor = Cursors.WaitCursor;

            _bndRec = Rectangle.FromLTRB((int)nupLeft.Value, (int)nupTop.Value, (int)nupRight.Value, (int)nupBottom.Value);
            if (_bndBmp != null)
            {
                _bndBmp.Dispose();
            }
            _bndBmp = MokkanExtraction.ExtractMokkanRegion(_oriBmp, _bndRec);

            ChangeThreshold();

            this.Cursor = Cursors.Default;
        }
        /// <summary>
        /// Change mokkan extraction parameters
        /// </summary>
        private void ChangeExtraction()
        {
            if (_init)
            {
                return;
            }

            this.Cursor = Cursors.WaitCursor;

            List <Boundary> bounds = MokkanExtraction.BoundaryTracking(_binBmp, _bndRec);

            // get top regions
            List <int> tops = new List <int>();

            GetTopAreas(bounds, _mokkanNum, tops);

            // number of regions
            int n = Math.Min(_mokkanNum, tops.Count - 1);

            DrawPolygon reducePolygon;

            MkaMokkanInfo.LastRBangou -= _list.Count;
            _list.Clear();
            Bitmap   ret = (Bitmap)_oriBmp.Clone();
            Graphics g   = Graphics.FromImage(ret);

            g.DrawRectangle(Pens.Red, _bndRec);

            for (int i = 0; i < n; i++)
            {
                if (_tolerance == 0)
                {
                    reducePolygon = new DrawPolygon();
                    foreach (PointF p in bounds[tops[i]].Points)
                    {
                        reducePolygon.AddPoint(new Point((int)p.X, (int)p.Y));
                    }
                }
                else
                {
                    // get reduce polygon
                    reducePolygon = PolygonApproximation.ReductionPolygon(bounds[tops[i]].Points, _tolerance);
                }

                _list.Add(reducePolygon);
                MkaMokkanInfo.LastRBangou++;

                g.DrawPolygon(_pen, bounds[tops[i]].Points.ToArray());
                g.FillPolygon(_brush, bounds[tops[i]].Points.ToArray());
            }

            g.Dispose();
            bounds.Clear();
            tops.Clear();

            if (picImageView.Image != null)
            {
                picImageView.Image.Dispose();
            }
            picImageView.Image = ret;

            this.Cursor = Cursors.Default;
        }
        /// <summary>
        /// Change thresholding method
        /// </summary>
        private void ChangeThreshold()
        {
            if (_init)
            {
                return;
            }

            this.Cursor = Cursors.WaitCursor;

            if (_binBmp != null)
            {
                _binBmp.Dispose();
            }

            if (rdbHSL.Checked)
            {
                _binBmp = MokkanExtraction.HSLFilter(_oriBmp, _bndRec, _hue, _sat, _lum);
            }
            else if (rdbYCbCr.Checked)
            {
                _binBmp = MokkanExtraction.YCbCrFilter(_oriBmp, _bndRec, _y, _cb, _cr);
            }
            else
            {
                Binarization.ExtractBackground = true;
                switch (cmbThresholding.SelectedItem.ToString())
                {
                case "MaxEntropy法":
                    _binBmp = Binarization.MaxEntropyThreshold(_bndBmp, _bndRec);
                    break;

                case "Otsu法":
                    _binBmp = Binarization.OtsuThreshold(_bndBmp, _bndRec);
                    break;

                case "SIS法":
                    _binBmp = Binarization.SISThreshold(_bndBmp, _bndRec);
                    break;

                case "Huang法":
                    _binBmp = Binarization.HuangThreshold(_bndBmp, _bndRec);
                    break;

                case "Yen法":
                    _binBmp = Binarization.YenThreshold(_bndBmp, _bndRec);
                    break;

                case "Li法":
                    _binBmp = Binarization.LiThreshold(_bndBmp, _bndRec);
                    break;

                case "Mean法":
                    _binBmp = Binarization.MeanThreshold(_bndBmp, _bndRec);
                    break;

                case "Moment法":
                    _binBmp = Binarization.MomentsThreshold(_bndBmp, _bndRec);
                    break;

                case "Iterative法":
                    _binBmp = Binarization.IteractiveThreshold(_bndBmp, _bndRec, 0, 128);
                    break;

                case "IsoData法":
                    _binBmp = Binarization.IsoDataThreshold(_bndBmp, _bndRec);
                    break;

                case "Percentile法":
                    _binBmp = Binarization.PercentileThreshold(_bndBmp, _bndRec);
                    break;

                case "閾値設定":
                    grbThreshold.Enabled = true;
                    _binBmp = Binarization.Threshold(_bndBmp, _bndRec, (int)nupThreshold.Value);
                    break;
                }
                Binarization.ExtractBackground = false;
            }

            ChangeExtraction();

            this.Cursor = Cursors.Default;
        }