ImageSimilarity 1.0.0
dotnet add package ImageSimilarity --version 1.0.0
NuGet\Install-Package ImageSimilarity -Version 1.0.0
<PackageReference Include="ImageSimilarity" Version="1.0.0" />
<PackageVersion Include="ImageSimilarity" Version="1.0.0" />
<PackageReference Include="ImageSimilarity" />
paket add ImageSimilarity --version 1.0.0
#r "nuget: ImageSimilarity, 1.0.0"
#:package ImageSimilarity@1.0.0
#addin nuget:?package=ImageSimilarity&version=1.0.0
#tool nuget:?package=ImageSimilarity&version=1.0.0
ImageSimilarity.Homography
ImageSimilarity.Homography — .NET-библиотека для сравнения изображений по ключевым точкам (ORB) и гомографии (RANSAC) через Emgu CV.
Позволяет определить, являются ли два изображения одним и тем же исходником, даже если они:
- кадрированы;
- уменьшены/увеличены;
- перекодированы в JPEG;
- изменены фильтрами;
- затемнены/осветлены;
- имеют текстовые подписи или графические оверлеи.
Библиотека возвращает числовую оценку сходства 0.0–1.0, а также подробные метрики матчинга.
✨ Возможности
- Масштабирование обоих изображений к единому размеру для стабильности ORB.
- Детекция и сравнение ключевых точек ORB.
- Матчинг через BFMatcher + KNN (k=2) + Lowe Ratio Test.
- Строительство гомографии через RANSAC.
- Подсчёт:
- количества матчей;
- количества инлаеров;
- доли инлаеров;
- итогового
SimilarityScore.
- Адаптивная формула скоринга:
- душит ложные совпадения при малом количестве матчей (например, «олени»/«деревья»);
- поддерживает высокие оценки для реальных дубликатов (даже с текстом и фильтрами).
- Подходит для бэкендов, микросервисов и контейнеров.
📦 Установка
dotnet add package ImageSimilarity
🚀 Быстрый старт
using ImageSimilarity;
var comparer = new ImageHomographyComparer();
var result = comparer.CompareFiles("original.jpg", "modified.jpg");
Console.WriteLine($"Score: {result.SimilarityScore:F3}");
Console.WriteLine($"Total matches: {result.TotalMatches}");
Console.WriteLine($"Inliers: {result.InliersCount}");
Console.WriteLine($"Inlier ratio: {result.InliersRatio:F3}");
Console.WriteLine($"Same origin: {result.IsSameOrigin()}");
📊 Интерпретация SimilarityScore
Рекомендуемая шкала:
| Score | Значение |
|---|---|
| 0.00–0.10 | Сцены разные |
| 0.10–0.40 | Некоторая общая структура / фон |
| 0.40–0.70 | Тот же источник, но с сильными изменениями (текст, фильтр, кадрирование) |
| 0.70–1.00 | Очень похожие изображения, один и тот же исходник |
IsSameOrigin() по умолчанию использует пороги:
SimilarityScore >= 0.5InliersCount >= 15
🧠 Как работает алгоритм
Нормализация масштаба
- оба изображения приводятся к одной длине длинной стороны (TargetLongSide = 600).
Преобразование в градации серого
ORB: детекция + дескрипторы
- количество фич: 1500;
- масштабирующий фактор: 1.2;
- уровни пирамиды: 8.
KNN-matching (k=2) + Lowe Ratio Test
- отсеиваются слабые совпадения.
Гомография через RANSAC
- формируется инлайер-маска.
Адаптивный скоринг
- если матчей мало (<30) → score душится квадратично;
- если много — учитывается качество (inlierRatio) + сила совпадения;
- итог в диапазоне [0..1].
🧩 Параметры
public int TargetLongSide { get; set; } = 600;
public int NumberOfFeatures { get; set; } = 1500;
public float ScaleFactor { get; set; } = 1.2f;
public int NLevels { get; set; } = 8;
public double LoweRatio { get; set; } = 0.75;
public double RansacReprojThreshold { get; set; } = 3.0;
Можно свободно настраивать.
📘 Пример интеграции в Minimal API
var builder = WebApplication.CreateBuilder(args);
var app = WebApplication.Create();
app.MapPost("/compare", async (HttpRequest request) =>
{
var form = await request.ReadFormAsync();
var source = form.Files.GetFile("source");
var search = form.Files.GetFile("search");
var temp1 = Path.GetTempFileName();
var temp2 = Path.GetTempFileName();
using (var s = File.Create(temp1)) await source.CopyToAsync(s);
using (var s = File.Create(temp2)) await search.CopyToAsync(s);
var comparer = new ImageHomographyComparer();
var result = comparer.CompareFiles(temp1, temp2);
return Results.Json(result);
});
app.Run();
📦 HomographyResult
public class HomographyResult
{
public int TotalMatches { get; set; }
public int InliersCount { get; set; }
public double InliersRatio { get; set; }
public double SimilarityScore { get; set; }
public bool IsSameOrigin(double scoreThreshold = 0.5, int minInliers = 15)
{
return SimilarityScore >= scoreThreshold && InliersCount >= minInliers;
}
}
🛠 Требования
- .NET 8+
- Emgu CV
- В Linux-контейнерах нужны нативные OpenCV-библиотеки:
- libopencv-core
- libopencv-imgproc
- libopencv-features2d
- libopencv-calib3d
⭐ Поддержка
Если хочешь добавить новые функции или предложить улучшения — открывай issue или Pull Request.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Emgu.CV (>= 4.12.0.5764)
- Emgu.CV.runtime.ubuntu-x64 (>= 4.12.0.5764)
- Emgu.CV.runtime.windows (>= 4.12.0.5764)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 673 | 12/2/2025 |