private void buttonFill_Click(object sender, EventArgs e)
        {
            Cursor oldCursor = Cursor.Current;

            Cursor.Current = Cursors.WaitCursor;

            int t = scrollT.Value;

            FillSource source    = this._GetCurrentFillSource();
            int        threshold = (int)nudThreshold.Value;

            for (int tw = 1; tw <= this._Project.T; tw++)
            {
                this._ClearCurrentAnalyzeArea(tw);
                source = this._Fill(this._getTargetZ(tw), tw, source, threshold);
            }

            nudT.Value     = t;
            Cursor.Current = oldCursor;
        }
        private FillSource _Fill(int z, int t, FillSource source, int threshold)
        {
            MicroImage microImage = this._Analyzer.GetMicroImage(z, t, "473");
            //MicroImage microImage561 = this._Analyzer.GetMicroImage(z, t, "561");
            Bitmap image = microImage.GetBinarizedImage(threshold);
            //Bitmap image561 = microImage561.GetBinarizedImage(threshold);

            ConnectedComponents components = ConnectedComponents.Analyze(image);
            //ConnectedComponents components561 = ConnectedComponents.Analyze(image561);

            Dictionary <int, int> labels = new Dictionary <int, int>();

            int sMinX = (source.MinX < 1) ? 0 : source.MinX;
            int sMaxX = (source.MaxX < 1) ? 0 : source.MaxX;
            int sMinY = (source.MinY < 1) ? 0 : source.MinY;
            int sMaxY = (source.MaxY < 1) ? 0 : source.MaxY;

            if (source.Label > 0)
            {
                for (int x = sMinX; x <= sMaxX; x++)
                {
                    for (int y = sMinY; y <= sMaxY; y++)
                    {
                        int label = components.Labels[x, y];

                        if (label <= 0)
                        {
                            continue;
                        }

                        if (source.Components.Labels[x, y] == source.Label)
                        {
                            if (labels.ContainsKey(label))
                            {
                                labels[label]++;
                            }
                            else
                            {
                                labels[label] = 1;
                            }
                        }
                    }
                }
            }

            int max = 0;

            foreach (KeyValuePair <int, int> label in labels)
            {
                if (max == 0)
                {
                    max = label.Key;
                }
                else if (label.Value >= labels[max])                 // TODO: 等しい場合の処理 中心が近いものなど
                {
                    max = label.Key;
                }
            }

            nudT.Value = t;

            FillSource newSource = new FillSource(components, max);

            if (max == 0)
            {
                checkEnabled.Checked = false;
            }
            else
            {
                int xLength = newSource.MaxX - newSource.MinX;
                int yLength = newSource.MaxY - newSource.MinY;
                int longer  = xLength > yLength ? xLength : yLength;

                checkEnabled.Checked = true;
                nudX.Value           = newSource.MinX + (int)(xLength / 2);
                nudY.Value           = newSource.MinY + (int)(yLength / 2);

                if (nudR.Maximum < ((int)(longer / 2) + 3))
                {
                    nudR.Value = nudR.Maximum;
                }
                else
                {
                    nudR.Value = (int)(longer / 2) + 3; // TODO: 3 shold be defined some where else.
                }

                nudThreshold.Value = threshold;
            }

            ////*************************** SPOT 解析 ***************************


            ////選択部分の取得
            //Bitmap imageEllipse = new Bitmap(image.Width, image.Height);
            //Graphics g = Graphics.FromImage(imageEllipse);
            //g.Clear(Color.Black);
            //g.FillEllipse(Brushes.White, (int)nudX.Value - (int)nudR.Value, (int)nudY.Value - (int)nudR.Value, (int)nudR.Value * 2, (int)nudR.Value * 2);
            //g.Dispose();

            //Dictionary<int, int> spotlabels = new Dictionary<int, int>();
            //Dictionary<int, int> spotlabels561 = new Dictionary<int, int>();

            //int startX = (int)nudX.Value - (int)nudR.Value - 1;
            //startX = startX < 0 ? 0 : startX;

            //int endX = (int)nudX.Value + (int)nudR.Value + 1;
            //endX = endX > image.Width ? image.Width : endX;

            //int startY = (int)nudY.Value - (int)nudR.Value - 1;
            //startY = startY < 0 ? 0 : startY;

            //int endY = (int)nudY.Value + (int)nudR.Value + 1;
            //endY = endY > image.Height ? image.Height : endY;

            //for (int x = startX; x < endX; x++)
            //{
            //    for (int y = startY; y < endY; y++)
            //    {
            //        int label = components.Labels[x, y];
            //        Color color = imageEllipse.GetPixel(x, y);

            //        if (label <= 0 || (color.R == 0 && color.G == 0 && color.B == 0))
            //        {
            //            continue;
            //        }

            //        if (spotlabels.ContainsKey(label))
            //        {
            //            spotlabels[label]++;
            //        }
            //        else
            //        {
            //            spotlabels[label] = 1;
            //        }
            //    }
            //}

            //for (int x = startX; x < endX; x++)
            //{
            //    for (int y = startY; y < endY; y++)
            //    {
            //        int label = components561.Labels[x, y];
            //        Color color = imageEllipse.GetPixel(x, y);

            //        if (label <= 0 || (color.R == 0 && color.G == 0 && color.B == 0))
            //        {
            //            continue;
            //        }

            //        if (spotlabels561.ContainsKey(label))
            //        {
            //            spotlabels561[label]++;
            //        }
            //        else
            //        {
            //            spotlabels561[label] = 1;
            //        }
            //    }
            //}
            //nudCount473.Value = spotlabels.Count;
            //nudCount561.Value = spotlabels561.Count;
            ////**************************************************

            this._SetCurrentAnalyzeArea();

            return(newSource);
        }