Full source code:

import cv2
import numpy as np
import glob

original = cv2.imread("original_golden_bridge.jpg")

# Sift and Flann
sift = cv2.xfeatures2d.SIFT_create()
kp_1, desc_1 = sift.detectAndCompute(original, None)

index_params = dict(algorithm=0, trees=5)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params, search_params)

# Load all the images
all_images_to_compare = []
titles = []
for f in glob.iglob("images\*"):
    image = cv2.imread(f)
    titles.append(f)
    all_images_to_compare.append(image)

for image_to_compare, title in zip(all_images_to_compare, titles):
    # 1) Check if 2 images are equals
    if original.shape == image_to_compare.shape:
        print("The images have same size and channels")
        difference = cv2.subtract(original, image_to_compare)
        b, g, r = cv2.split(difference)

        if cv2.countNonZero(b) == 0 and cv2.countNonZero(g) == 0 and cv2.countNonZero(r) == 0:
            print("Similarity: 100% (equal size and channels)")
                break

    # 2) Check for similarities between the 2 images
    kp_2, desc_2 = sift.detectAndCompute(image_to_compare, None)

    matches = flann.knnMatch(desc_1, desc_2, k=2)

    good_points = []
    for m, n in matches:
        if m.distance < 0.6*n.distance:
            good_points.append(m)

    number_keypoints = 0
    if len(kp_1) <= len(kp_2):
        number_keypoints = len(kp_1)
    else:
        number_keypoints = len(kp_2)


    print("Title: " + title)
    percentage_similarity = len(good_points) / number_keypoints * 100
    print("Similarity: " + str(int(percentage_similarity)) + "\n")

Files:

images comparison.zip

Import the libraries and load Sift and Flann objects

From Line 1 to Line 3 we import the libraries.
We added a new library glob, which we need to read all the files from a specific folder. It’s by default installed in python, so you don’t need to do anything, just import it.

From Line 7 to Line 13 we load the objects Sift and Flann and we detect the Keypoints and descriptors of the original image.

import cv2
import numpy as np
import glob

original = cv2.imread("original_golden_bridge.jpg")

# Sift and Flann
sift = cv2.xfeatures2d.SIFT_create()
kp_1, desc_1 = sift.detectAndCompute(original, None)

index_params = dict(algorithm=0, trees=5)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params, search_params)

Load Images and Titles

On Line 16 we create an empty array where we’re going to load later all the images.
On Line 17 we create an empty array where we’re going to load the titles of the images.
On Line 18 we loop trough all the images inside the folder “images”.
On Line 19 we load each image and then we add title and image to the arrays we created before.

# Load all the images
all_images_to_compare = []
titles = []
for f in glob.iglob("images\*"):
    image = cv2.imread(f)
    titles.append(f)
    all_images_to_compare.append(image)

Find similarities and print the result

On Line 23 We loop trough all the images loaded and the titles.
From Line 24 to Line 31 we check if the images are completely equal. If they are, we break the loop, as it’s pointless to check for similarity if we already know that they are equal, and we go to next image.
From Line 35 to Line 53 we check the similarity between the images and we print the result.

for image_to_compare, title in zip(all_images_to_compare, titles):
    # 1) Check if 2 images are equals
    if original.shape == image_to_compare.shape:
        print("The images have same size and channels")
        difference = cv2.subtract(original, image_to_compare)
        b, g, r = cv2.split(difference)
 
        if cv2.countNonZero(b) == 0 and cv2.countNonZero(g) == 0 and cv2.countNonZero(r) == 0:
            print("Similarity: 100% (equal size and channels)")
            break
 
    # 2) Check for similarities between the 2 images
    kp_2, desc_2 = sift.detectAndCompute(image_to_compare, None)
 
    matches = flann.knnMatch(desc_1, desc_2, k=2)
 
    good_points = []
    for m, n in matches:
        if m.distance < 0.6*n.distance:
            good_points.append(m)
 
    number_keypoints = 0
    if len(kp_1) <= len(kp_2):
        number_keypoints = len(kp_1)
    else:
        number_keypoints = len(kp_2)
 
 
    print("Title: " + title)
    percentage_similarity = len(good_points) / number_keypoints * 100
    print("Similarity: " + str(int(percentage_similarity)) + "\n")