Оптимизация сравнения двух изображений

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Оптимизация сравнения двух изображений

Сообщение yus » 10.07.2019 21:13:37

olegy123 писал(а):там много недостатков, хеши нужны для "отпечатков" данных, быстры при поиске но если бит будет изменен то весь хеш станет иным.

Возможно, все же зависит от задачи. Но мне приходилось сравнивать изменения изображения этим алгоритмом, вполне себе справляется.
Дешево (по ресурсам) и быстро.
yus
новенький
 
Сообщения: 27
Зарегистрирован: 29.03.2015 14:29:29
Откуда: Москва

Re: Оптимизация сравнения двух изображений

Сообщение debi12345 » 11.07.2019 00:24:26

Как насчет сторонних C-шных либ, собранных с поддержкой векторных инструкций процов (SSE, AVХ,..) ? Раз в 5..10 быстрее будет.
Пример таковой либы - правда на "плюсах" (в паскале без C-обертки не заюзаешь)
https://github.com/ermig1979/Simd
The Simd Library is a free open source image processing library, designed for C and C++ programmers. It provides many useful high performance algorithms for image processing such as: pixel format conversion, image scaling and filtration, extraction of statistic information from images, motion detection, object detection (HAAR and LBP classifier cascades) and classification, neural network.
The algorithms are optimized with using of different SIMD CPU extensions. In particular the library supports following CPU extensions: SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2 and AVX-512 for x86/x64, VMX(Altivec) and VSX(Power7) for PowerPC (big-endian), NEON for ARM.
The Simd Library has C API and also contains useful C++ classes and functions to facilitate access to C API. The library supports dynamic and static linking, 32-bit and 64-bit Windows, Android and Linux, MSVS, G++ and Clang compilers, MSVS project and CMake build systems.


Добавлено спустя 8 часов 31 минуту 21 секунду:
Даже Фэйсбук к этим делам приложил руку:
This month, we released Facebook AI Similarity Search (Faiss), a library that allows us to quickly search for multimedia documents that are similar to each other — a challenge where traditional query search engines fall short. We’ve built nearest-neighbor search implementations for billion-scale data sets that are some 8.5x faster than the previous reported state-of-the-art, along with the fastest k-selection algorithm on the GPU known in the literature. This lets us break some records, including the first k-nearest-neighbor graph constructed on 1 billion high-dimensional vectors.

https://code.fb.com/data-infrastructure ... ty-search/
https://github.com/facebookresearch/faiss

Есть даже реализация для видеокарт:
Billion-scale similarity search with GPUs

https://arxiv.org/pdf/1702.08734.pdf
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5295
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Оптимизация сравнения двух изображений

Сообщение Alex2013 » 12.07.2019 08:14:47

yus писал(а):Мне понравился вот такой алгоритм сравнения изображений.
https://habr.com/ru/post/120562/

Что-то отдаленно похожие у меня тоже есть...
Код: Выделить всё
// Отношение  заполненных пикселей к их количеству в процентах;
Function  FastStat( Bitmap: TBitmap;CC:Integer):Byte;
Type
RGB1=Record  B,G,R  : byte; end;
var
  X, Y,Sum:Integer;
  PixelPtr: PInteger;
  PixelRowPtr: PInteger;
  BytePerPixel: Integer;
  BW:Byte;
  PRGB:^RGB1;
  begin
  Result:=0;
  If   Bitmap.Width*Bitmap.Height=0 then exit;
  try
    Sum:=0;
    Bitmap.BeginUpdate(False);
    PixelRowPtr := PInteger(Bitmap.RawImage.Data);
    BytePerPixel := Bitmap.RawImage.Description.BitsPerPixel div 8;
    for Y := 0 to Bitmap.Height - 1 do begin
      PixelPtr := PixelRowPtr;
      for X := 0 to Bitmap.Width - 1 do begin
       PRGB:=Pointer(PixelPtr);
       With PRGB^ do begin
                      If rgb(R,G,B) =CC then Sum:=Sum+1;
                   end;
        Inc(PByte(PixelPtr), BytePerPixel);
      end;
      Inc(PByte(PixelRowPtr),Bitmap.RawImage.Description.BytesPerLine);
    end;
  finally
   Bitmap.EndUpdate(False);
  end;
If   Sum <>0  then
     Result:=Trunc(Sum /(Bitmap.Width*Bitmap.Height)*100);
end;

(Позволяет быстро отсеять совсем уж непохожие на метку контуры и используется для "спрайтов" подогнанных под шаблон 50х50 так что "оптимизация побоку", а выигрыш идет за счет сравнения с просчитанным заранее "числом маски" плюс "быстрый отсев" работает при любом угле поворота и прочих линейных искажениях, способ хабра, разумеется, надежнее зато менее гибкий )
(сравнивается разность Abs( FastStat( Bitmap1,0)- FastStat( Bitmap2,0)) < разрешенное_отличие и разумеется можно не огрублять результат до Byte но мне и его хватает )
Alex2013
энтузиаст
 
Сообщения: 1493
Зарегистрирован: 03.04.2013 11:59:44

Пред.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru