public Dictionary <int, int> Compare(ImageDescriptors referenceImage, ImageDescriptors targetImage, double threshold)
        {
            Dictionary <int, int> result = new Dictionary <int, int>();

            for (int i = 0; i < targetImage.Count; i++)
            {
                IndexValue <double>[] temp = new IndexValue <double> [referenceImage.Count];

                for (int j = 0; j < referenceImage.Count; j++)
                {
                    temp[j] = new IndexValue <double>(j, Descriptor.CalculateAngle(referenceImage[j], targetImage[i]));
                }

                SortAlgorithm.Heapsort <IndexValue <double> >(ref temp, SortDirection.Descending);

                if (temp[0].Value.Equals(double.NaN))
                {
                    throw new NotImplementedException();
                }

                if (temp[0].Value / temp[1].Value < threshold)
                {
                    result.Add(i, temp[0].Index);
                }
            }

            return(result);
        }
        public int FindMatch(ImageDescriptors image, double threshold)
        {
            List <IndexValue <double> > values = CalculateSimilariry(image, threshold);

            SortAlgorithm.Heapsort <IndexValue <double> >(ref values, SortDirection.Ascending);

            return(values[0].Index);
        }
        public static ImageDescriptors Deserialize(string path)
        {
            System.Xml.Serialization.XmlSerializer serializer = new XmlSerializer(typeof(ImageDescriptors));

            System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(path);

            ImageDescriptors result = (ImageDescriptors)serializer.Deserialize(reader);

            reader.Close();

            return(result);
        }
        //Lowe use threshold = 0.8
        public List <IndexValue <double> > CalculateSimilariry(ImageDescriptors image, double threshold)
        {
            List <IndexValue <double> > values = new List <IndexValue <double> >();

            for (int i = 0; i < database.Count; i++)
            {
                Dictionary <int, int> temp = Compare(this.database[i], image, threshold);

                values.Add(new IndexValue <double>(i, temp.Count));
            }

            return(values);
        }