public static PCTFeature_Lab ReadingFeatureFromFile_Lab(String filePath)
        {
            PCTFeature_RGB pctFeature_RGB = ReadingFeatureFromFile_RGB(filePath);

            if (pctFeature_RGB == null)
            {
                return(null);
            }

            PCTFeature_Lab pctFeature_Lab = pctFeature_RGB.ToPCTFeature_Lab();

            return(pctFeature_Lab);
        }
        private static int CountColorsVW_Lab(PCTFeature_Lab pct, List <Lab> colorVisualWord)
        {
            //Dictionary<String, Color> map = new Dictionary<string, Color>();
            List <Lab> listColorVWs = new List <Lab>();

            foreach (var item in pct.ListColorPoint)
            {
                Lab color = colorVisualWord[DistanceHelper.ColorKNN_Lab(item.color, colorVisualWord)];
                if (!listColorVWs.Contains(color))
                {
                    listColorVWs.Add(color);
                }
                //if (!map.ContainsKey(key))
                //    map.Add(key, color);
            }
            //int totalColor = map.Count;
            //return totalColor;
            return(listColorVWs.Count);
        }
        public static void RunIndexing_Lab(string imageIndexStoragePath)
        {
            #region init
            List <Lab> visualWordColor = ColorHelper.GenerateColorVisualWord_Lab();                       // *
            Dictionary <string, List <string> > visualWordMain = new Dictionary <string, List <string> >();
            List <VisualWordCell_Lab>           listKeys       = VisualWordHelper.CreateListVWKeys_Lab(); // *
            foreach (var item in listKeys)
            {
                // *
                string key = item.Color.L + "_" + item.Color.A + "_" + item.Color.B + "_" + item.XIndex + "_" + item.YIndex;
                visualWordMain.Add(key, new List <String>());
            }
            string indexFileNameExtension = GetIndexFileNameExtension();
            #endregion

            // for each folder
            int      count   = 0;
            string[] SubDirs = Directory.GetDirectories(ConfigCommon.PCT_OUTPUT_PATH);
            foreach (String folderPath in SubDirs)
            {
                Console.WriteLine((++count) + ". " + folderPath);
                FileInfo[] fileInfos = FileManager.GetInstance().GetAllFileInFolder(folderPath);
                int        sizeFiles = fileInfos.Length;
                // for each X file (X = PCTConfig.PCT_STEP_INDEX_FILE)
                for (int i = 0; i < sizeFiles; i += ConfigPCT.PCT_STEP_INDEX_FILE)
                {
                    // read data PCT from file
                    PCTFeature_Lab dataPCT = PCTReadingFeature.ReadingFeatureFromFile_Lab(fileInfos[i].FullName); // *

                    // if number of color visual-word > Y, skip (Y = PCTConfig.COLOR_NOISE_THRESHOLD)
                    int numberColor = CountColorsVW_Lab(dataPCT, visualWordColor);
                    if (numberColor > ConfigPCT.COLOR_NOISE_THRESHOLD)
                    {
                        continue;
                    }

                    foreach (Dot_Lab colorPoint in dataPCT.ListColorPoint)
                    {
                        // if radius >= Z, index it (Z = PCTConfig.RADIUS_THRESHOLD)
                        if (colorPoint.radius >= ConfigPCT.RADIUS_THRESHOLD)
                        {
                            List <RegionOfFrame> listRegionDotBelongTo = Utils.RegionOfFrameHelper.GetListRegionDotBelongTo(colorPoint.location, colorPoint.radius, dataPCT.Width, dataPCT.Height);
                            Lab color = visualWordColor[DistanceHelper.ColorKNN_Lab(colorPoint.color, visualWordColor)];

                            foreach (RegionOfFrame region in listRegionDotBelongTo)
                            {
                                //Key_PCTIndexDicLab key = new Key_PCTIndexDicLab(color.L, color.A, color.B, region.X + "_" + region.Y);
                                string key = color.L + "_" + color.A + "_" + color.B + "_" + region.X + "_" + region.Y;
                                visualWordMain[key].Add(dataPCT.FrameName);
                                //if (!visualWordMain[key].Contains(dataPCT.FrameName)) // slow
                                //    visualWordMain[key].Add(dataPCT.FrameName);
                            }
                        }
                    }
                }
            }

            foreach (var item in listKeys)
            {
                string key = item.Color.L + "_" + item.Color.A + "_" + item.Color.B + "_" + item.XIndex + "_" + item.YIndex;
                Console.WriteLine("Distincting value of key " + key + " ...");
                visualWordMain[key] = visualWordMain[key].Distinct().ToList();
            }
            // save the indexing to a file
            //String json = JsonConvert.SerializeObject(visualWordMain);
            //FileManager.GetInstance().WriteFile(json, Path.Combine(imageIndexStoragePath, "index.json"));
            string fileSavePath = Path.Combine(imageIndexStoragePath, indexFileNameExtension);
            if (File.Exists(fileSavePath))
            {
                File.Delete(fileSavePath);
            }
            //FileManager.GetInstance().WriteDicIndexingToJsonFile(visualWordMain, fileSavePath);
            FileManager.GetInstance().WriteDicIndexingToFiles(visualWordMain, fileSavePath);
        }