public override MtripletsFeature Extract(Bitmap image) { var minutiae = MinutiaeExtractor.ExtractFeatures(ImageProvider.AdaptImage(image)); var mtriplets = new List <MTriplet>(); var triplets = new Dictionary <int, int>(); foreach (var triangle in Delaunay2D.Triangulate(minutiae)) { var idxArr = new[] { (short)triangle.A, (short)triangle.B, (short)triangle.C }; var newMTriplet = new MTriplet(idxArr, minutiae); var newHash = newMTriplet.GetHashCode(); if (!triplets.ContainsKey(newHash)) { triplets.Add(newHash, 0); mtriplets.Add(newMTriplet); } } mtriplets.TrimExcess(); return(new MtripletsFeature(mtriplets, minutiae)); }
public override TicoFeatures Extract(Bitmap image) { var mtiae = MinutiaeExtractor.ExtractFeatures(image); var dirImg = ImageOrietantionExtractor.ExtractFeatures(image); return(new TicoFeatures(mtiae, dirImg)); }
public override JiangFeatures Extract(Bitmap image) { var minutiae = MinutiaeExtractor.ExtractFeatures(image); var skeletonImg = SkeletonImageExtractor.ExtractFeatures(image); var descriptorsList = new List <JiangMinutiaDescriptor>(); if (minutiae.Count <= 3) { return(new JiangFeatures(descriptorsList)); } var mtiaIdx = new Dictionary <Minutia, int>(); for (var i = 0; i < minutiae.Count; i++) { mtiaIdx.Add(minutiae[i], i); } for (short idx = 0; idx < minutiae.Count; idx++) { var query = minutiae[idx]; var nearest = GetNearest(minutiae, query); for (var i = 0; i < nearest.Length - 1; i++) { for (var j = i + 1; j < nearest.Length; j++) { var newMTriplet = new JiangMinutiaDescriptor(skeletonImg, minutiae, idx, nearest[i], nearest[j]); descriptorsList.Add(newMTriplet); } } } descriptorsList.TrimExcess(); return(new JiangFeatures(descriptorsList)); }
public override MtripletsFeature Extract(Bitmap image) { var minutiae = MinutiaeExtractor.ExtractFeatures(image); var result = new List <MTriplet>(); var triplets = new Dictionary <int, int>(); var nearest = new short[minutiae.Count, NeighborsCount]; var distance = new double[minutiae.Count, NeighborsCount]; // Initializing distances for (var i = 0; i < minutiae.Count; i++) { for (var j = 0; j < NeighborsCount; j++) { distance[i, j] = double.MaxValue; nearest[i, j] = -1; } } // Computing m-triplets for (short i = 0; i < minutiae.Count; i++) { // Updating nearest minutiae UpdateNearest(minutiae, i, nearest, distance); // Building m-triplets for (var j = 0; j < NeighborsCount - 1; j++) { for (var k = j + 1; k < NeighborsCount; k++) { if (nearest[i, j] != -1 && nearest[i, k] != -1) { if (i == nearest[i, j] || i == nearest[i, k] || nearest[i, j] == nearest[i, k]) { throw new Exception("Wrong mtp"); } var newMTriplet = new MTriplet(new[] { i, nearest[i, j], nearest[i, k] }, minutiae); var newHash = newMTriplet.GetHashCode(); if (!triplets.ContainsKey(newHash)) { triplets.Add(newHash, 0); result.Add(newMTriplet); } } } } } result.TrimExcess(); return(new MtripletsFeature(result, minutiae)); }
public override PartialeFeatures Extract(Bitmap image) { var minutiae = MinutiaeExtractor.ExtractFeatures(image); var result = new List <MinutiaTriplet>(); if (minutiae.Count > 3) { foreach (var triangle in Delaunay2D.Triangulate(minutiae)) { var idxArr = new[] { (short)triangle.A, (short)triangle.B, (short)triangle.C }; var newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.A, (short)triangle.C, (short)triangle.B }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.B, (short)triangle.A, (short)triangle.C }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.B, (short)triangle.C, (short)triangle.A }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.C, (short)triangle.A, (short)triangle.B }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); idxArr = new[] { (short)triangle.C, (short)triangle.B, (short)triangle.A }; newMTriplet = new MinutiaTriplet(idxArr, minutiae); result.Add(newMTriplet); } } result.TrimExcess(); return(new PartialeFeatures(result, minutiae)); }