public static double CalcSimilarDegree(string filePathOrigin, string filePathTemp) { Mat mat1; Mat mat2; Mat mat11 = new Mat(); Mat mat22 = new Mat(); Image originImage = Image.FromFile(filePathOrigin); Image tempImage = Image.FromFile(filePathTemp); Bitmap bitmap1 = new Bitmap(originImage); Bitmap bitmap2 = new Bitmap(tempImage); originImage.Dispose(); tempImage.Dispose(); if (bitmap1.Width > bitmap2.Width && bitmap1.Height > bitmap2.Height) { bitmap1 = new Bitmap(ZoomPicture(bitmap1, bitmap2.Width, bitmap2.Height)); } else { bitmap2 = new Bitmap(ZoomPicture(bitmap2, bitmap1.Width, bitmap1.Height)); } mat1 = bitmap1.ToMat(); mat2 = bitmap2.ToMat(); Cv2.CvtColor(mat1, mat11, ColorConversionCodes.BGR2GRAY); Cv2.CvtColor(mat2, mat22, ColorConversionCodes.BGR2GRAY); mat11.ConvertTo(mat11, MatType.CV_32F); mat22.ConvertTo(mat22, MatType.CV_32F); double score = Cv2.CompareHist(mat11, mat22, HistCompMethods.Correl) * 100; return(score); }
private void CompareHistogramWithStepImage(Mat _removeBackgorundImage) { _removeBackgorundImage.ConvertTo(_removeBackgorundImage, MatType.CV_32F); Cv2.Normalize(_removeBackgorundImage, openCVImage.stepImage[currentStep]); // , 1.0, 0.0, NormTypes.L1 compareValue = Cv2.CompareHist(openCVImage.stepImage[currentStep], _removeBackgorundImage, HistCompMethods.Chisqr); }
static double Compare(string str1, string str2, HistCompMethods method) { Mat mat1 = new Mat(str1, ImreadModes.AnyColor); Mat mat2 = new Mat(@str1, ImreadModes.AnyColor); Mat mat3 = new Mat(); var value = Cv2.CompareHist(mat1, mat2, method); Console.WriteLine(new FileInfo(str1).Name + "-" + new FileInfo(str2).Name + ":" + value); return(value); }
public double[] CompareHist(Mat img, Mat template, bool showImage = false) { Mat[] imgs = HistogramCalculation(img, showImage); Mat[] templates = HistogramCalculation(template, showImage); double[] ratios = new double[3]; for (int i = 0; i < imgs.Count(); i++) { ratios[i] = Cv2.CompareHist(imgs[i], templates[i], HistCompMethods.Bhattacharyya); } return(ratios); }
private void CompareHistogram(Mat _dstImage, int step) { _dstImageBuffer = _dstImage.Clone(); stepImageBufferOfBuffer = stepImageBuffer[step].Clone(); _dstImageBuffer.ConvertTo(_dstImageBuffer, MatType.CV_32F); stepImageBufferOfBuffer.ConvertTo(stepImageBufferOfBuffer, MatType.CV_32F); Cv2.Normalize(_dstImageBuffer, stepImageBufferOfBuffer); openCVImage.stepHist[step] = Cv2.CompareHist(stepImageBufferOfBuffer, _dstImageBuffer, HistCompMethods.Chisqr); }
public double CompareImageByHist(Mat img, Mat refImg, bool showImage = false) { Mat imgHsv = new Mat(); Mat refImgHsv = new Mat(); Cv2.CvtColor(img, imgHsv, ColorConversionCodes.RGB2HSV); Cv2.CvtColor(refImg, refImgHsv, ColorConversionCodes.RGB2HSV); Mat[] imgHsvs = Cv2.Split(imgHsv); Mat[] refImgHsvs = Cv2.Split(refImgHsv); int bin1 = 50; int bin2 = 60; int[] bins = { bin1, bin2 }; int[] channels = { 0, 1 }; Rangef[] ranges = new Rangef[] { new Rangef(0, 180), new Rangef(0, 256) }; Mat imgHist = new Mat(img.Size(), MatType.CV_32FC2); Mat refImgHist = new Mat(img.Size(), MatType.CV_32FC2); Cv2.CalcHist(imgHsvs, channels, new Mat(), imgHist, 2, bins, ranges, true, false); Cv2.Normalize(imgHist, imgHist, 1, 0, NormTypes.MinMax, -1, null); Cv2.CalcHist(refImgHsvs, channels, new Mat(), refImgHist, 2, bins, ranges, true, false); Cv2.Normalize(refImgHist, refImgHist, 1, 0, NormTypes.MinMax, -1, null); double ratio = Cv2.CompareHist(imgHist, refImgHist, HistCompMethods.KLDiv); if (showImage == true) { Mat img1 = img.Clone(); Cv2.PutText(img1, ratio.ToString(), new Point(50, 50), HersheyFonts.HersheyPlain, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias); Cv2.ImShow("CompareHistTestVSRef", img1); Cv2.WaitKey(); Cv2.DestroyWindow("CompareHistTestVSRef"); } return(ratio); }
SquareClassificationScores[,] CalcSquareClassifications(Mat frame) { var result = new SquareClassificationScores[8, 8]; Mat squareMask = new Mat(frame.Size(), MatType.CV_8U); var histSize = new[] { 16, 16, 16 }; var histRanges = new[] { new Rangef(0f, 256f), new Rangef(0f, 256f), new Rangef(0f, 256f) }; for (int row = 0; row < 8; row++) { for (int col = 0; col < 8; col++) { squareMask.SetTo(Scalar.Black); _histChessboardModel.DrawSquareMask(row, col, squareMask, HistChessboardModel.SquareMaskScale); Mat squareHist = new Mat(); Cv2.CalcHist( images: new[] { frame }, channels: new int[] { 0, 1, 2 }, mask: squareMask, hist: squareHist, dims: 3, histSize: histSize, ranges: histRanges); var method = HistCompMethods.Correl; var squareColor = HistChessboardModel.SquareColor(row, col); var likeWhitePiece = Cv2.CompareHist( h1: squareHist, h2: _histChessboardModel.XOnYHist[(int)ChessColor.White, squareColor], method: method); var likeBlackPiece = Cv2.CompareHist( h1: squareHist, h2: _histChessboardModel.XOnYHist[(int)ChessColor.Black, squareColor], method: method); var likeEmpty = Cv2.CompareHist( h1: squareHist, h2: _histChessboardModel.XOnYHist[(int)SquareState.Empty, squareColor], method: method); result[row, col] = new SquareClassificationScores(new [] { likeWhitePiece, likeBlackPiece, likeEmpty }); } } return(result); }
/// <summary> /// 通过直方图比较 /// </summary> /// <param name="sourceImage"></param> /// <param name="targetImage"></param> /// <param name="method"></param> /// <returns></returns> public static double CompareImageByHistogram(string sourceImage, string targetImage, HistCompMethods method = HistCompMethods.KLDiv) { using (Mat source = new Mat(sourceImage, ImreadModes.AnyColor | ImreadModes.AnyDepth)) using (Mat target = new Mat(targetImage, ImreadModes.AnyColor | ImreadModes.AnyDepth)) { //1:从BGR空间转换到HSV色彩空间 Mat src1HSV = new Mat(); Mat src2HSV = new Mat(); Cv2.CvtColor(source, src1HSV, ColorConversionCodes.BGR2HSV); Cv2.CvtColor(target, src2HSV, ColorConversionCodes.BGR2HSV); //Mat[] mats = new Mat[] { baseHSV, src1HSV, src2HSV }; Mat[] mats2 = Cv2.Split(src1HSV); Mat[] mats3 = Cv2.Split(src2HSV); //计算直方图并归一化数据 int bin1 = 50; //灰度等级 int bin2 = 60; //灰度等级 int[] histSiz = { bin1, bin2 }; int[] channels = { 0, 1 }; //图像通道数 Rangef[] rangefs = new Rangef[] //梯度值范围 { new Rangef(0, 180), new Rangef(0, 256) }; Mat Img2 = new Mat(source.Size(), MatType.CV_32FC2); Mat Img3 = new Mat(target.Size(), MatType.CV_32FC2); Cv2.CalcHist(mats2, channels, new Mat(), Img2, 2, histSiz, rangefs, true, false); Cv2.Normalize(Img2, Img2, 0, 1, NormTypes.MinMax, -1, null); Cv2.CalcHist(mats3, channels, new Mat(), Img3, 2, histSiz, rangefs, true, false); Cv2.Normalize(Img3, Img3, 0, 1, NormTypes.MinMax, -1, null); //比较直方图 double s1coms2 = Cv2.CompareHist(Img2, Img3, method); return(s1coms2); } }
public void matchTestCompareHist() { Mat img = new Mat(Images.picTest, ImreadModes.Color); Mat refImg = new Mat(Images.picSetRef, ImreadModes.Color); Mat imgHsv = new Mat(); Mat refImgHsv = new Mat(); Cv2.CvtColor(img, imgHsv, ColorConversionCodes.RGB2HSV); Cv2.CvtColor(refImg, refImgHsv, ColorConversionCodes.RGB2HSV); Mat[] imgHsvs = Cv2.Split(imgHsv); Mat[] refImgHsvs = Cv2.Split(refImgHsv); int bin1 = 50; int bin2 = 60; int[] bins = { bin1, bin2 }; int[] channels = { 0, 1 }; Rangef[] ranges = new Rangef[] { new Rangef(0, 180), new Rangef(0, 256) }; Mat imgHist = new Mat(img.Size(), MatType.CV_32FC2); Mat refImgHist = new Mat(img.Size(), MatType.CV_32FC2); Cv2.CalcHist(imgHsvs, channels, new Mat(), imgHist, 2, bins, ranges, true, false); Cv2.Normalize(imgHist, imgHist, 1, 0, NormTypes.MinMax, -1, null); Cv2.CalcHist(refImgHsvs, channels, new Mat(), refImgHist, 2, bins, ranges, true, false); Cv2.Normalize(refImgHist, refImgHist, 1, 0, NormTypes.MinMax, -1, null); double ratio = Cv2.CompareHist(refImgHist, imgHist, HistCompMethods.Bhattacharyya); }
public decimal Compare(Mat first, Mat second) { var result = Cv2.CompareHist(first, second, HistCompMethods.Chisqr); return((decimal)Math.Round(result, 2)); }
private static void HistogarmToComparison(string path1, string path2, string path3) { using (Mat baseMat = new Mat(path1, ImreadModes.AnyColor | ImreadModes.AnyDepth)) using (Mat src1 = new Mat(path2, ImreadModes.AnyColor | ImreadModes.AnyDepth)) using (Mat src2 = new Mat(path3, ImreadModes.AnyColor | ImreadModes.AnyDepth)) { //1:从BGR空间转换到HSV色彩空间 Mat baseHSV = new Mat(); Mat src1HSV = new Mat(); Mat src2HSV = new Mat(); Cv2.CvtColor(baseMat, baseHSV, ColorConversionCodes.BGR2HSV); Cv2.CvtColor(src1, src1HSV, ColorConversionCodes.BGR2HSV); Cv2.CvtColor(src2, src2HSV, ColorConversionCodes.BGR2HSV); //Mat[] mats = new Mat[] { baseHSV, src1HSV, src2HSV }; Mat[] mats1 = Cv2.Split(baseHSV); Mat[] mats2 = Cv2.Split(src1HSV); Mat[] mats3 = Cv2.Split(src2HSV); //计算直方图并归一化数据 int bin1 = 50; //灰度等级 int bin2 = 60; //灰度等级 int[] histSiz = { bin1, bin2 }; int[] channels = { 0, 1 }; //图像通道数 Rangef[] rangefs = new Rangef[] //梯度值范围 { new Rangef(0, 180), new Rangef(0, 256) }; Mat Img1 = new Mat(baseMat.Size(), MatType.CV_32FC2); Mat Img2 = new Mat(src1.Size(), MatType.CV_32FC2); Mat Img3 = new Mat(src2.Size(), MatType.CV_32FC2); HistCompMethods method = HistCompMethods.KLDiv; Cv2.CalcHist(mats1, channels, new Mat(), Img1, 2, histSiz, rangefs, true, false); Cv2.Normalize(Img1, Img1, 0, 1, NormTypes.MinMax, -1, null); Cv2.CalcHist(mats2, channels, new Mat(), Img2, 2, histSiz, rangefs, true, false); Cv2.Normalize(Img2, Img2, 0, 1, NormTypes.MinMax, -1, null); Cv2.CalcHist(mats3, channels, new Mat(), Img3, 2, histSiz, rangefs, true, false); Cv2.Normalize(Img3, Img3, 0, 1, NormTypes.MinMax, -1, null); //比较直方图 double bcomb = Cv2.CompareHist(Img1, Img1, method); double s1coms2 = Cv2.CompareHist(Img2, Img3, method); double bcoms1 = Cv2.CompareHist(Img1, Img2, method); double bcoms2 = Cv2.CompareHist(Img1, Img3, method); Mat mats1Ands2 = new Mat(); src2.CopyTo(mats1Ands2); Cv2.PutText(baseMat, bcomb.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias); Cv2.PutText(src1, bcoms1.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias); Cv2.PutText(src2, bcoms2.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias); Cv2.PutText(mats1Ands2, s1coms2.ToString(), new Point(30, 30), HersheyFonts.HersheyComplex, 1, new Scalar(0, 255, 0), 2, LineTypes.AntiAlias); using (new Window("Img1 :Img1", WindowMode.Normal, baseMat)) using (new Window("Img1 :Img2", WindowMode.Normal, src1)) using (new Window("Img1 :Img3", WindowMode.Normal, src2)) { Cv2.WaitKey(0); } } }
public static bool IsUnique(Mat face) { if (_faces.Count == 0) { var color1 = ColorsExtractor.ExtractMiddleColor(face); color1 = ColorsExtractor.ClosestColorRgb(color1); _faces.Add(face); _facesMiddleColors.Add(color1); return(true); } /// Using 50 bins for hue and 60 for saturation int h_bins = 50; int s_bins = 60; int[] histSize = new int[2] { h_bins, s_bins }; // hue varies from 0 to 179, saturation from 0 to 255 var h_ranges = new Rangef(0, 180); var s_ranges = new Rangef(0, 256); var ranges = new Rangef[] { h_ranges, s_ranges }; // Use the o-th and 1-st channels int[] channels = new int[2] { 0, 1 }; var faceHsv = face.CvtColor(ColorConversionCodes.BGR2HSV); var faceHistogram = new Mat(); Cv2.CalcHist(new Mat[] { faceHsv }, channels, new Mat(), faceHistogram, 2, histSize, ranges, true, false); Cv2.Normalize(faceHistogram, faceHistogram, 0, 1, NormTypes.MinMax, -1, new Mat()); var color = ColorsExtractor.ExtractMiddleColor(face); foreach (var f in _faces) { var fHsv = f.CvtColor(ColorConversionCodes.BGR2HSV); var fHistogram = new Mat(); Cv2.CalcHist(new Mat[] { fHsv }, channels, new Mat(), fHistogram, 2, histSize, ranges, true, false); Cv2.Normalize(fHistogram, fHistogram, 0, 1, NormTypes.MinMax, -1, new Mat()); double correl = Cv2.CompareHist(faceHistogram, fHistogram, HistCompMethods.Correl); //if (correl > 0.5) return false; bool contains = _facesMiddleColors.Contains(color); if (correl > 0.4 && contains) { return(false); } //if (correl > 0.65) return false; } color = ColorsExtractor.ExtractMiddleColor(face); _faces.Add(face); _facesMiddleColors.Add(color); return(true); }
private void Analyze() { ArrayList position = CountImage(); int length = position.Count; Mat[] srcImage = new Mat[length]; Mat[] hsvImage = new Mat[length]; Mat[] histogram = new Mat[length]; Mat originSrcImage = new Mat(mOriginImageURL); Mat originHsvImage = new Mat(); Mat originHistogram = new Mat(); for (int i = 0; i < length; i++) { srcImage[i] = new Mat(mSimilarImage[(int)position[i]].URL); hsvImage[i] = new Mat(); Cv2.CvtColor(srcImage[i], hsvImage[i], ColorConversionCodes.BGR2HSV); } Cv2.CvtColor(originSrcImage, originHsvImage, ColorConversionCodes.BGR2HSV); int hBins = 50; int sBins = 60; int[] histSize = { hBins, sBins }; Rangef[] ranges = { new Rangef(0, 180), new Rangef(0, 256) }; int[] channels = { 0, 1 }; for (int i = 0; i < length; i++) { histogram[i] = new Mat(); Cv2.CalcHist( images: new[] { hsvImage[i] }, channels: channels, mask: null, hist: histogram[i], dims: 1, histSize: histSize, ranges: ranges); Cv2.Normalize(histogram[i], histogram[i], 0, 1, NormTypes.MinMax); } Cv2.CalcHist( images: new[] { originHsvImage }, channels: channels, mask: null, hist: originHistogram, dims: 1, histSize: histSize, ranges: ranges); Cv2.Normalize(originHistogram, originHistogram, 0, 1, NormTypes.MinMax); double maxValue = 0; int maxID = 0; for (int i = 0; i < length; i++) { double bass = Cv2.CompareHist(originHistogram, histogram[i], HistCompMethods.Correl); if (bass < 0) { bass = 0; } if (i == 0) { maxValue = bass; maxID = 0; } else { if (maxValue < bass) { maxValue = bass; maxID = i; } } mSimilarity[(int)position[i]] = (float)bass * 100; MyLog.LogManager.Log("SimilarImage-Analyze-Method[" + (int)position[i] + "] Perfect: " + mSimilarity[(int)position[i]]); } MyLog.LogManager.Log("SimilarImage-Analyze-가장 유사한 그림의 유사도: " + maxValue); Dispatcher.Invoke(new Action(delegate() { BitmapImage tmpImage = new BitmapImage(); tmpImage.BeginInit(); tmpImage.CacheOption = BitmapCacheOption.OnLoad; mResultIndex = (int)position[maxID]; tmpImage.UriSource = new Uri(mSimilarImage[mResultIndex].URL); tmpImage.EndInit(); similar_result_image.Source = tmpImage; similar_analyze.Content = FindResource(Constants.STRING_BUTTON_COMPLETE); similar_analyze.IsEnabled = false; similar_btn_target_histogram.IsEnabled = true; similar_btn_result_histogram.IsEnabled = true; StringBuilder str = new StringBuilder(); for (int i = 0; i < length; i++) { str.Clear(); str.Append((string)FindResource(Constants.STRING_SIMILAR_LABEL)); str.Append(string.Format(" {0:0.####}", mSimilarity[(int)position[i]])); str.Append("%"); mSimilarLabel[(int)position[i]].Content = str.ToString(); } })); }