Как ответили выше, сегодня уже полно готовых велосипедов для этого.
Раньше это делалось например так:
1) При загрузке изображение конвертируется в grayscale (обесцвеченное) и уменьшается в размерах (например, до 10-15 пикселов по наибольшей стороне)
2) Полученная мелкая картинка преобразовывается в хэш
3) По базе ранее загруженных изображений выполняется поиск этого хэша
4а) Если совпадений нет - загрузка подтверждается, в базе делается новая запись
4б) Если совпадения найдены - выдаётся ответ о том, что такое изображение уже есть