python-3.xnumpyopencvimage-processingimagehash

Numpy error trying to use difference hashing with the ImageHash library


I am trying to perform difference hashing with the python ImageHash library and keep getting a numpy error.

The error:

File "/Users/testuser/Desktop/test_folder/test_env/lib/python3.8/site-packages/imagehash.py", line 252, in dhash image = image.convert("L").resize((hash_size + 1, hash_size), Image.ANTIALIAS) AttributeError: 'numpy.ndarray' object has no attribute 'convert'

The code:

from PIL import Image
from cv2 import cv2
import imagehash
import numpy as np

def hash_and_compare(image1, image2):
    image1 = image1
    image2 = image2

    # read images
    image1 = cv2.imread(image1)
    image2 = cv2.imread(image2)

    # convert to grayscale
    image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
    image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)

    # resize images
    image1 = cv2.resize(image1, (9, 8))
    image2 = cv2.resize(image2, (9, 8))

    # hash images
    image1_hash = imagehash.dhash(image1)
    image2_hash = imagehash.dhash(image2)

    # compute hamming distance
    distance = image1_hash - image2_hash

    if image1_hash <= 10:
        print(distance)
        print('match')
    else:
        print(distance)
        print('no match')

hash_and_compare('/Users/testuser/Desktop/test_folder/game_name056496.png', '/Users/testuser/Desktop/test_folder/game_name499761.png')

Solution

  • as it is mentioned in imagehash library's document, @image must be a PIL instance.. so you cant set numpy array as input of the dshash function.if you want do some preprocess with opencv, you should convert it into PIL array before setting it into dhash, like this :

    import numpy as np
    from PIL import Image
    ...
    some preprocess
    ...
    # You may need to convert the color.
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    im_pil = Image.fromarray(img)
    image1_hash = imagehash.dhash(im_pil)