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<SixLabors.ImageSharp.PixelFormats.Rgba32>(img1))
{

    var actions = new List<Action>();
    //翻轉委託
    actions.Add(() =>
    {
        using Image<SixLabors.ImageSharp.PixelFormats.Rgba32> 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<SixLabors.ImageSharp.PixelFormats.Rgba32>(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章