C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# OpenCVSharp4

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

作者:宣君

这篇文章主要为大家详细介绍了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文