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

 更新时间:2023年09月10日 09:43:04   作者:宣君  
这篇文章主要为大家详细介绍了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#替换Word文档中的书签内容的详细步骤

    C#替换Word文档中的书签内容的详细步骤

    Word书签不但可以帮助读者快速跳转到想要查看的位置,而且可以用做“占位符”,本文总结了一个将常见的Word文档元素替换进书签的C#解决方案,希望对大家有所帮助
    2025-08-08
  • Unity实现粒子光效导出成png序列帧

    Unity实现粒子光效导出成png序列帧

    这篇文章主要为大家详细介绍了Unity实现粒子光效导出成png序列帧,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#中阻止硬件休眠的多种实现方法

    C#中阻止硬件休眠的多种实现方法

    本文介绍了在C#中阻止系统休眠的多种方法,核心方案是通过调用Windows API的SetThreadExecutionState函数,可控制显示器关闭和系统休眠行为,感兴趣的可以了解一下
    2025-07-07
  • 轻松学习C#的装箱与拆箱

    轻松学习C#的装箱与拆箱

    轻松学习C#的装箱与拆箱,在之前的文章简单的提到了轻松学习C#的装箱与拆箱,本文带着大家更加详细的介绍轻松学习C#的装箱与拆箱,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • C# 实现Scoket心跳机制的方法

    C# 实现Scoket心跳机制的方法

    这篇文章主要介绍了C# 实现Scoket心跳机制的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 使用VS2019生成C#应用安装包的方法步骤

    使用VS2019生成C#应用安装包的方法步骤

    本文主要介绍了使用VS2019生成C#应用安装包的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • C#中序列化实现深拷贝,实现DataGridView初始化刷新的方法

    C#中序列化实现深拷贝,实现DataGridView初始化刷新的方法

    下面小编就为大家带来一篇C#中序列化实现深拷贝,实现DataGridView初始化刷新的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • C#如何生成唯一订单号

    C#如何生成唯一订单号

    这篇文章主要为大家详细介绍了C#如何生成唯一订单号,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • C#变量命名规则小结

    C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C# 实现QQ式截图功能实例代码

    C# 实现QQ式截图功能实例代码

    本篇文章主要介绍了C# 实现QQ式截图功能实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02

最新评论