C#结合OpenCVSharp4使用直方图算法比较图片相似度

C#结合OpenCVSharp4使用直方图算法比较图片相似度

直方图有灰度直方图颜色直方图,如果是灰度图像,那么就用灰度直方图,这里使用颜色直方图来计算两个图片的相似度。

这里只记录如何使用,至于算法原理,问就是不会。

直方图算法效率高,但精度不够,适合快速比较,例如以图搜图

1. 下载 OpenCVSharp4

通过NuGet包管理器进行下载。搜索OpenCVSharp4下载。可参考前一篇文章:C#结合OpenCVSharp4图片相似度识别

2. 使用

        /// <summary>         /// 直方图相关性          /// 结果越接近1 则越相似         /// 图片相似度识别(精度不高,速度较快,可用于以图搜图)         /// </summary>         /// <param name="imgFile1"></param>         /// <param name="imgFile2"></param>         public double Compare_Hist(string imgFile1, string imgFile2)         {             var matA = Cv2.ImRead(imgFile1);             var matB = Cv2.ImRead(imgFile2);              // 拆分通道             Cv2.Split(matA, out Mat[] matA_S);             Cv2.Split(matB, out Mat[] matB_S);              //直方图的像素范围                Rangef[] histRange = { new Rangef(0, 256) };              //直方图数组大小             int[] histSize = { 256 };              //直方图输出数组             Mat hist_A = new Mat();             Mat hist_B = new Mat();              bool uniform = true, accumulate = false;             Cv2.CalcHist(matA_S, new int[] { 0, 1, 2 }, null, hist_A, 1, histSize, histRange, uniform, accumulate);             Cv2.CalcHist(matB_S, new int[] { 0, 1, 2 }, null, hist_B, 1, histSize, histRange, uniform, accumulate);              //归一化,排除图像分辨率不一致的影响             Cv2.Normalize(hist_A, hist_A, 0, 1, NormTypes.MinMax, -1, null);             Cv2.Normalize(hist_B, hist_B, 0, 1, NormTypes.MinMax, -1, null);              //相关性比较             var res = Cv2.CompareHist(hist_A, hist_B, HistCompMethods.Correl);             return res;         } 

比较结果

C#结合OpenCVSharp4使用直方图算法比较图片相似度

C#结合OpenCVSharp4使用直方图算法比较图片相似度

可以看出基本符合预期。

注意:由于直方图算法未考虑像素的空间位置,所以当图片旋转后,仍会被认为是同一个图

下面是将图片旋转后的计算结果,可以看到跟没有旋转时的计算结果一样

C#结合OpenCVSharp4使用直方图算法比较图片相似度

记录完毕~

发表评论

评论已关闭。

相关文章