• C#实现图片对比-支持图片旋转


    前言

    虽然已经正式转JAVA了,但最近发现一个特别好的开源项目masuit,不仅提供很多简便的功能,还有图像的一些特殊操作功能。
    之前我们比较图片应该都是使用的openCV,不过这个masuit,看上去也不错,而且代码使用简单,因此强烈推荐。
    下面就实现一个简单图像对比。

    实现对比

    首先添加引用masuit,如下图:

    代码如下,实现一个可以对比翻转,旋转的图片。

    点击查看代码
    
    using Masuit.Tools.Media;
    using SixLabors.ImageSharp;
    using System.Diagnostics;
    using SixLabors.ImageSharp.Processing;
    
    
    var sw = Stopwatch.StartNew();
    string img1 = "img/img1.png";
    string img2 = "img/img3.png";
    var hasher = new ImageHasher();
    var hash1 = hasher.DifferenceHash256(img1); 
    var hashList = new List<ulong[]>();
    hashList.Add(hash1);
    var sim = 0.85;
    using (var image1 = SixLabors.ImageSharp.Image.Load(img1))
    {
    
        var actions = new List();
        //翻转委托
        actions.Add(() =>
        {
            using Image clone = image1.Clone(c => c.Flip(FlipMode.Horizontal));
            var flipH = clone.DifferenceHash256();
            hashList.Add(flipH);
        });
        actions.Add(() =>
        {
            using var clone = image1.Clone(c => c.Flip(FlipMode.Vertical));
            var flipV = clone.DifferenceHash256();
            hashList.Add(flipV);
        });
        //选择委托
        actions.Add(() =>
        {
            using var clone = image1.Clone(c => c.Rotate(90));
            var rotate90 = clone.DifferenceHash256();
            hashList.Add(rotate90);
        });
        actions.Add(() =>
        {
            using var clone = image1.Clone(c => c.Rotate(180));
            var rotate180 = clone.DifferenceHash256();
            hashList.Add(rotate180);
        });
        actions.Add(() =>
        {
            using var clone = image1.Clone(c => c.Rotate(270));
            var rotate270 = clone.DifferenceHash256();
            hashList.Add(rotate270);
        });
        Parallel.Invoke(actions.ToArray());
    
        var hash2 = hasher.DifferenceHash256(img2);
        var similar = hashList.Select(h => ImageHasher.Compare(hash2, h)).Max();
        if (similar >= sim)
        {
            Console.WriteLine($"是一样的图片 similar:{similar}");
        }
        else
        {
            Console.WriteLine($"不是一样的图片  similar:{similar}");
        }
        using (var image2 = SixLabors.ImageSharp.Image.Load(img2))
        {
            Console.WriteLine($"比较图片信息--分辨率:{image2.Width}x{image2.Height},大小:{new FileInfo(img2).Length / 1024}KB");
        }
        Console.WriteLine(sw.ElapsedMilliseconds + "ms");
        Console.ReadKey();
    
    }
    
    
    

    测试运行

    这里使用三张图片对比,如下:

    第一张是原图,第二张是略微裁剪边缘的图片,第三张是旋转图片。

    1图和2图比较结果如下:

    1图和3图比较结果如下:


    代码简单实用,非常值得使用,比较速度也很快,大概在1秒以内。


    注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!



    若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

    https://www.cnblogs.com/kiba/p/18053616.html

  • 相关阅读:
    mysql毫秒日期相互转换
    国际阿里云:云服务器灾备方案!!!
    论文和源码解读:T2I-Adapter: Learning Adapters to Dig out More Controllable Ability
    获取该虚拟机的所有权失败,主机上的某个应用程序正在使用该虚拟机
    计算机毕业设计Java校园流浪猫图鉴管理系统的设计与实现(源码+系统+mysql数据库+Lw文档)
    制作pcb流畅
    02c++呵呵老师【官方案例FloatingActor】
    DVD复制软件 DVD-Cloner 2023 mac中文版软件介绍
    【暑期每日一题】洛谷 P6153 询问
    【Linux初阶】多线程2 | 分离线程,线程库,线程互斥,可重入VS线程安全,锁的常见概念
  • 原文地址:https://www.cnblogs.com/kiba/p/18053616