Как вариант
Как вариант мне кажется нужно использовать механизм трассировки лучей с разных местоположений.
те выделить пропорциональные блоки (размер блока - от 1x1px до 100x100px) и из центров этих блоков производить трассировку на 360 градусов.
Так мы получим очертания (по резким скачкам контрасности) объекта\ов. Как хранить эти очертания не уверен (не математик я, но думаю можно решить эту задачу) из каждого блока.
Каждый блок это отдельный элемент массива, который в результате содержит свое очертание на 360 градусов (возможно очертание это еще один или несколько массивов)
Затем начать поиск примерно совпадающих очертаний в массиве блоков второй картинки. Если индексы будут отличаться то имеет место трансформация.
Попробовать определить тип трансформации - поворот, сжатие и тд.
После науденной трансформации сравнить очертания для двух картинок с учетом смещения индексов массивов (это смещение мы узнаем после определения была ли трансформация)
Это и весь алгоритм.
Скажу где он будет работать:
1) два одинаковых изображения - но одно чернобелое
2) два одинаковых изображения но одно повернуто на какое-то количество градусов
3) два изображения где на одном круг а на другом восьмерка - поймет как разные запросто
и тд
Где могут буть сложности:
1) изображения с большим количеством мелких элементов - пример города
2) кошку вряди отличит от собаки
и тд
Но тут получается есть параметр - строгость трассировки - это количество блоков, на которое картинка разбивается. Чем больше тем больше шанс отличить кошку от собаки (по определению пропорций и различиям в шерси и возможных других элементах такие как хвост), но и тем медленнее будет работать сравнение.
Думаю мой метод имеет право на жизнь а если его совместить с цветовыми методами то вообще будут практически идеальные варианты.