public void AreaStatistics(Bitmap bitmap, int AreaTageCount, ref Dictionary <int, Pixel> Pixels, out Dictionary <int, Dictionary <int, Pixel> > DEdgePoints, out Dictionary <int, Dictionary <int, Pixel> > DEdgeSortPoints, out Dictionary <int, Characteristic> Characteristics) { //long start, end; //时钟周期 //long frequency; //时钟频率 //timecount.QueryPerformanceFrequency(out frequency); //timecount.QueryPerformanceCounter(out start);//开始时间//////// Dictionary <int, Characteristic> characteristics = new Dictionary <int, Characteristic> (); Dictionary <int, Dictionary <int, Pixel> > dEdgePoints = new Dictionary <int, Dictionary <int, Pixel> >(); Dictionary <int, Dictionary <int, Pixel> > dEdgeSortPoints = new Dictionary <int, Dictionary <int, Pixel> > (); Dictionary <int, Dictionary <int, Pixel> > dAreaCollection = new Dictionary <int, Dictionary <int, Pixel> >(); int areaSum = 0; int effectAreaCount = 0; int averageArea = 0; int sortTag = 1; int dAreaCollectionTage = 0; int thearea = 0; int maxareatag = 1; int[] maxarea = new int[AreaTageCount + 1]; int sum1 = 0, sum2 = 0; //for (int i = 0; i < AreaTageCount; i++) //{ // maxarea[i] = 0; //}//求面积直方图用到; for (int i = 1; i <= AreaTageCount; i++) { Dictionary <int, Pixel> areaCollection = new Dictionary <int, Pixel>(); dAreaCollection.Add(i, areaCollection); } //////////////////////////////////////////////////////以上耗时:0; int width = bitmap.Width; int height = bitmap.Height; for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (Pixels [i + j * width].AreaTag != 0) { dAreaCollection[Pixels[i + j * width].AreaTag].Add(i + j * width, Pixels[i + j * width]); } } } /////////////////////////////////////////////////////以上耗时122; for (int i = 1; i <= AreaTageCount; i++) { if (dAreaCollection[i].Count() >= 5) { areaSum += dAreaCollection[i].Count(); effectAreaCount++; } } if (effectAreaCount != 0) { averageArea = areaSum / effectAreaCount; } ///////////////////////////////////////////////////以上耗时0; //求面积直方图,耗时3936太长,暂时保留处理; //////////////////////////////////////////////////////////////////////////////// //for (int i = 1; i <= AreaTageCount; i++) //{ // thearea = dAreaCollection[i].Count(); // sum1 = (int)(thearea * 0.8); sum2 = (int)(thearea * 1.2); // for (int j = 0; j <= AreaTageCount - i; j++) // { // if (dAreaCollection[i + j].Count() >= sum1 && dAreaCollection[i + j].Count() <= sum2&& thearea>=200) // { // maxarea[i]++; // } // } //} /////////////////////////////////////////////////////////以上耗时3936!!!!; //for (int i = 1; i <= AreaTageCount; i++) //{ // if (maxarea[i] > maxarea[maxareatag]) // maxareatag = i; //} //thearea = dAreaCollection[maxareatag].Count();//求面积直方图用; for (int i = 1; i <= AreaTageCount; i++) { //thearea = dAreaCollection[maxareatag].Count(); if (dAreaCollection[i].Count() < averageArea / 15 || dAreaCollection[i].Count() > averageArea * 10) { if (dAreaCollection[i].Count() != 0) { foreach (KeyValuePair <int, Pixel> item in dAreaCollection[i]) { Pixels[item.Key].AreaTag = 0; } } dAreaCollection.Remove(i); } else if (dAreaCollection[i].Count() != 0) { int CentroidXSum = 0; int CentroidYSum = 0; int CentroidX = 0; int CentroidY = 0; foreach (KeyValuePair <int, Pixel> item in dAreaCollection[i]) { CentroidXSum += Pixels[item.Key].X; CentroidYSum += Pixels[item.Key].Y; } CentroidX = CentroidXSum / dAreaCollection[i].Count(); CentroidY = CentroidYSum / dAreaCollection[i].Count(); ////去除极不规则区域(质心在目标区域外) //if (!dAreaCollection[i].ContainsKey(CentroidX + CentroidY * width)) //{ // foreach (KeyValuePair<int, Pixel> item in dAreaCollection[i]) // { // Pixels[item.Key].AreaTag = 0; // } // dAreaCollection.Remove(i); //} } } while (sortTag <= dAreaCollection.Count() && dAreaCollectionTage <= AreaTageCount) { if (dAreaCollection.ContainsKey(dAreaCollectionTage)) { int edgeSortTag = 1; int CentroidXSum = 0; int CentroidYSum = 0; int CentroidX = 0; int CentroidY = 0; //int expX = 0; int expY = 0; //float yita = 0; Dictionary <int, Pixel> edgePoints = new Dictionary <int, Pixel>(); Dictionary <int, Pixel> edgeSortPoints = new Dictionary <int, Pixel>(); foreach (KeyValuePair <int, Pixel> item in dAreaCollection[dAreaCollectionTage]) { if (!(dAreaCollection[dAreaCollectionTage].ContainsKey(item.Key - 1) && dAreaCollection[dAreaCollectionTage].ContainsKey(item.Key + 1) && dAreaCollection[dAreaCollectionTage].ContainsKey(item.Key - width) && dAreaCollection[dAreaCollectionTage].ContainsKey(item.Key + width))) { Pixels[item.Key].EdgeTag = sortTag; edgePoints.Add(item.Key, Pixels[item.Key]); edgeSortPoints.Add(edgeSortTag, Pixels[item.Key]); edgeSortTag++; } Pixels[item.Key].AreaTag = sortTag; CentroidXSum += Pixels[item.Key].X; CentroidYSum += Pixels[item.Key].Y; //expX = Pixels[item.Key].X; expY = Pixels[item.Key].Y; //yita += (float)((Math.Exp(-(expX * expX + expY * expY) / 2)) / (1 / Math.Sqrt(2 * Math.PI))); } dEdgePoints.Add(sortTag, edgePoints); dEdgeSortPoints.Add(sortTag, edgeSortPoints); //2016/4/27 CentroidX = CentroidXSum / dAreaCollection[dAreaCollectionTage].Count(); CentroidY = CentroidYSum / dAreaCollection[dAreaCollectionTage].Count(); Point Centroid = new Point(CentroidX, CentroidY); Characteristic characteristic = new Characteristic(); characteristic.Area = dAreaCollection[dAreaCollectionTage].Count(); characteristic.AreaTage = dAreaCollectionTage; characteristic.Centroid = Centroid; characteristic.CentreAcerageColor = Color.White; characteristic.MajorAxis = 0; characteristic.MinorAxis = 0; characteristic.MajToMinAxisRatio = 1; //characteristic.Yita=yita; characteristic.Perimeter = 0; characteristic.IsQualifiedColony = false; characteristic.IsInvalidColony = false; characteristics.Add(sortTag, characteristic); sortTag++; } dAreaCollectionTage++; } DEdgePoints = dEdgePoints; DEdgeSortPoints = dEdgeSortPoints; Characteristics = characteristics; //timecount.QueryPerformanceCounter(out end);//结束时间///////////// ////显示时间 //_time = (int)((end - start) * 1000 / frequency); }