/// <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; }