首页 > 编程语言 >C#结合OpenCVSharp4使用直方图算法比较图片相似度

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

时间:2023-09-09 13:55:58浏览次数:46  
标签:Mat C# Cv2 OpenCVSharp4 hist 直方图 new

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;
        }

比较结果

image

image

可以看出基本符合预期。

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

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

image

记录完毕~

标签:Mat,C#,Cv2,OpenCVSharp4,hist,直方图,new
From: https://www.cnblogs.com/ycit/p/17689380.html

相关文章

  • css-定位
    相对定位top-20px——first上移20px  绝对定位:相对于浏览器:  相对于父级元素(给父级元素一个position)  固定定位:彻底定死,区别绝对定位 相当于加了z轴,好多图册     ......
  • 洛谷P8211 [THUPC2022 初赛] 搬砖
    题目链接以下设\(B\)为一个阈值,同时也表示值域分块的块长。先考虑所有\(b\)都不为\(0\)的情况。对于一组询问,我们设一个\(x\)表示:当前已搬完所有\(a\leqx\)的砖。那么每次只可能是以下两种情况之一:有至少一摞砖在当前这个单位时间内被搬完拿\(x\)加上\(d\),之......
  • 无涯教程-JavaScript - IMSINH函数
    描述MSINH函数以x+yi或x+yj文本格式返回复数的双曲正弦值。复数的双曲正弦通过以下公式计算-$$\sinh(x+yi)=\sinh(x)\cos(y)-\cosh(x)\sin(y)i$$语法IMSINH(inumber)争论Argument描述Required/OptionalInumberAcomplexnumberforwhichyouwantthehype......
  • 从cnblogs转到知乎写笔记,从评论中向大家学习
    Friday,June24,2022,11:29:29AM从cnblogs转到知乎写笔记,从评论中向大家学习本来是想把知乎账号的一句话介绍改成上面这句话的,但是在手机或者电脑上不同日期、时间尝试改了几次,都提示系统维护中。这简单的改个自我介绍都如此麻烦,让我不由得怀疑这可能不是技术问题,而是某种......
  • PCL学习笔记 | PCL的安装
    可选择自己需要的版本下载https://github.com/PointCloudLibrary/pcl/tags。我选择的是PCL1.12下载标黄的两个文件。"PCL-1.12.0-AllInOne-msvc2019-win64.exe"是PointCloudLibrary(PCL)的一个全包版本,特定为MicrosoftVisualStudio2019(MSVC2019)和64位Windows系统构建的。......
  • Visual Studio Code:代码编辑与开发的全能工具
    在现代软件开发中,一个高效且强大的代码编辑工具是不可或缺的。VisualStudioCode(简称VSCode)作为一款免费开源的代码编辑器,以其丰富的功能和活跃的社区受到了广大开发者的喜爱。本文将介绍VSCode的基本用法和主要特点,帮助您更好地使用这个强大的开发工具。VisualStudioCode简介......
  • [题解] CF29D Ant on the Tree
    CF29DAntontheTree题目知识点:LCA。题目传送门题意给定一棵以\(1\)为节点的树,再给定树的所有叶子节点的一个序列。现在执行一个操作:从\(1\)开始遍历每个节点,并返回根,要求每条边经过的次数一定为\(2\)。问是否能够使得访问节点序列中叶子节点的序列符合给定序列的条......
  • 6 TCP
    packageInternet;importjava.io.IOException;importjava.io.InputStream;importjava.net.ServerSocket;importjava.net.Socket;//服务端:先有服务端再有客户端publicclassTest16_Server{publicstaticvoidmain(String[]args)throwsIOException{......
  • LLamaSharp - .NET Binding for llama.cpp
    https://github.com/SciSharp/LLamaSharp TheC#/.NETbindingof llama.cpp.ItprovidesAPIstoinferencetheLLaMaModelsanddeployitonlocalenvironment.ItworksonbothWindows,LinuxandMACwithoutrequirmentforcompilingllama.cppyourself.Its......
  • Semantic Kernel
    https://github.com/microsoft/semantic-kernelSemanticKernel isanSDKthatintegratesLargeLanguageModels(LLMs)like OpenAI, AzureOpenAI,and HuggingFace withconventionalprogramminglanguageslikeC#,Python,andJava.SemanticKernelachievesth......