public int Otsu(GrayPixelHistogram[] histogram) { //def Probability[] _pixelProbability = new Probability[_maxPixelValue]; Variance[] _thresholdVariance = new Variance[_maxPixelValue]; Variance _threshold = new Variance(); for (int i = 0; i < _maxPixelValue; i++) { _pixelProbability[i] = new Probability(); _thresholdVariance[i] = new Variance(); } int _counter = 0; double _objectProbability = 0; double _groundProbability = 0; double _objectAverage = 0; double _groundAverage = 0; //int _threshold = 0; //calculate probability for each pixel and store data foreach (var item in histogram) { _pixelProbability[_counter].pixel = item.Value; _pixelProbability[_counter].probability = ((double)item.Count / (double)_imageSize); //Console.WriteLine((float)item.Count / (float)_imageSize); _counter++; } //for each threshold -> t for (int t = 0; t < _maxPixelValue; t++) { _objectProbability = 0; _groundProbability = 0; _objectAverage = 0; _groundAverage = 0; //calculate probability of object for (int i = 0; i <= t; i++) { _objectProbability += _pixelProbability[i].probability; } //calculate probability of ground for (int i = t + 1; i < _maxPixelValue; i++) { _groundProbability += _pixelProbability[i].probability; } //calculate average of object for (int i = 0; i <= t; i++) { _objectAverage += (i * _pixelProbability[i].probability / _objectProbability); } //calculate average of ground for (int i = t + 1; i < _maxPixelValue; i++) { _groundAverage += (i * _pixelProbability[i].probability / _groundProbability); } //calculate viariance for each threshold -> t _thresholdVariance[t].threshold = t; _thresholdVariance[t].interViariance = _objectProbability * _groundProbability * (_objectAverage - _groundAverage) * (_objectAverage - _groundAverage); } //_threshold = _thresholdVariance.GroupBy(x => x.interViariance).Select(group => group.Where(x => x.interViariance == group.Max(y => y.interViariance))).First(); _threshold = _thresholdVariance.MaxBy(x => x.interViariance); //GroupBy(x => x.Title).Select(group => group.Where(x => x.Price == group.Max(y => y.Price)).First()); ; return(_threshold.threshold); }
/// <summary> /// OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。 /// </summary> /// <param name="histogram"></param> /// <returns></returns> public int Otsu(GrayPixelHistogram[] histogram) { //def Probability[] _pixelProbability = new Probability[_maxPixelValue]; Variance[] _thresholdVariance = new Variance[_maxPixelValue]; Variance _threshold = new Variance(); Bitmap myBitmap = new Bitmap(_sampleImage.Width, _sampleImage.Height); for (int i = 0; i < _maxPixelValue; i++) { _pixelProbability[i] = new Probability(); _thresholdVariance[i] = new Variance(); } int _counter = 0; double _objectProbability = 0; double _groundProbability = 0; double _objectAverage = 0; double _groundAverage = 0; //int _threshold = 0; //calculate probability for each pixel and store data foreach (var item in histogram) { _pixelProbability[_counter].pixel = item.Value; _pixelProbability[_counter].probability = ((double)item.Count / (double)_imageSize); //Console.WriteLine((float)item.Count / (float)_imageSize); _counter++; } //for each threshold -> t for (int t = 0; t < _maxPixelValue; t++) { _objectProbability = 0; _groundProbability = 0; _objectAverage = 0; _groundAverage = 0; //calculate probability of object for (int i = 0; i <= t; i++) { _objectProbability += _pixelProbability[i].probability; } //calculate probability of ground for (int i = t + 1; i < _maxPixelValue; i++) { _groundProbability += _pixelProbability[i].probability; } //calculate average of object for (int i = 0; i <= t; i++) { _objectAverage += (i * _pixelProbability[i].probability / _objectProbability); } //calculate average of ground for (int i = t + 1; i < _maxPixelValue; i++) { _groundAverage += (i * _pixelProbability[i].probability / _groundProbability); } //calculate viariance for each threshold -> t _thresholdVariance[t].threshold = t; _thresholdVariance[t].interViariance = _objectProbability * _groundProbability * (_objectAverage - _groundAverage) * (_objectAverage - _groundAverage); } //_threshold = _thresholdVariance.GroupBy(x => x.interViariance).Select(group => group.Where(x => x.interViariance == group.Max(y => y.interViariance))).First(); _threshold = _thresholdVariance.MaxBy(x => x.interViariance); //GroupBy(x => x.Title).Select(group => group.Where(x => x.Price == group.Max(y => y.Price)).First()); ; int j = 0; for (int Xcount = 0; Xcount < myBitmap.Width; Xcount++) { for (int Ycount = 0; Ycount < myBitmap.Height; Ycount++) { if (_originalPixels[j].value > _threshold.threshold) { myBitmap.SetPixel(Xcount, Ycount, Color.White); } else if (_originalPixels[j].value < _threshold.threshold) { myBitmap.SetPixel(Xcount, Ycount, Color.Black); } j++; } } pictureBoxOtsu.Image = myBitmap; return(_threshold.threshold); }