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; }
比较结果
可以看出基本符合预期。
注意:由于直方图算法未考虑像素的空间位置,所以当图片旋转后,仍会被认为是同一个图
下面是将图片旋转后的计算结果,可以看到跟没有旋转时的计算结果一样
记录完毕~
本文来自博客园,作者:宣君{https://www.nhit.icu/},转载请注明原文链接:https://www.cnblogs.com/ycit/p/17689380.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步