Нечёткое сравнение двух изображений

altОдной из задач моей последней курсовой работы было нечёткое сравнение изображений. Реализовать данную возможность я решил сам, без помощи сторонних библиотек.


Всё оказалось не так сложно как казалось в начале. (Хотя, наверное, оно всегда так).

Суть метода довольно простая: построить матрицы дескрипторов для каждого изображения и вычислить процент схожести матриц. Не сложно, правда?

Итак, матрица дескрипторов будет представлять из себя матрицу 32х32, содержащую целые положительные числа.

В результате, был получен модуль для нечёткого сравнения изображений. (Исходник модуля приведу ниже)

Процедуры и функции модуля:

function HashFile(path:string):TResultMatrix;

Функция, предназначенная для анализа изображения из файла на диске. Результат работы функции – матрица дескрипторов изображения.

function ScanBitmap(bmp:TBitmap):TResultMatrix;

Функция аналогична предыдущей, но строит матрицу дескрипторов для изображения , которое передаётся в виде битовой карты (bmp) через заголовок.

function ResultToStr(res:TResultMatrix):string;

Функция преобразует матрицу дескрипторов в строковое представления. В таком виде мы её легко можем хранить где угодно.

function StrToResult(str:string): TResultMatrix;

Функция преобразует строку в матрицу дескрипторов. По сути, это функция, обратная ResultToStr.

function CompareResults(res1, res2:TResultMatrix): Integer;

Вот мы и добрались к главной функции модуля. Эта функция сравнивает два изображения используя матрицы дескрипторов. Результат работы функции — процент схожести изображений (0% – 100%).

procedure ShowHistograme(Series: TBarSeries; img: string);

Процедура для построения гистограммы яркости изображения. В данный модуль попала случайно, но, мало ли, вдруг кому пригодится.

Примечание:
Данный алгоритм не является идеальным. Его можно улучшить (например реализовать подсчёт процента с использованием дисперсии и мат. ожидания. Тогда точность сравнения повысится). В данном примере я всего лишь поделится с другими тем что сделал сам. Возможно, это кому-то поможет и будет полезно.

Понравилась статья? Поделиться с друзьями: