Example #1
0
        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);
        }
Example #2
0
        /// <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);
        }