Одной из задач моей последней курсовой работы было нечёткое сравнение изображений. Реализовать данную возможность я решил сам, без помощи сторонних библиотек.
Всё оказалось не так сложно как казалось в начале. (Хотя, наверное, оно всегда так).
Суть метода довольно простая: построить матрицы дескрипторов для каждого изображения и вычислить процент схожести матриц. Не сложно, правда?
Итак, матрица дескрипторов будет представлять из себя матрицу 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);
Процедура для построения гистограммы яркости изображения. В данный модуль попала случайно, но, мало ли, вдруг кому пригодится.
Примечание:
Данный алгоритм не является идеальным. Его можно улучшить (например реализовать подсчёт процента с использованием дисперсии и мат. ожидания. Тогда точность сравнения повысится). В данном примере я всего лишь поделится с другими тем что сделал сам. Возможно, это кому-то поможет и будет полезно.