Skip to content

Instantly share code, notes, and snippets.

@hempnall
Created January 1, 2018 20:46
Show Gist options
  • Save hempnall/7dfeac8d9318bd98212e9ab41b5b7924 to your computer and use it in GitHub Desktop.
Save hempnall/7dfeac8d9318bd98212e9ab41b5b7924 to your computer and use it in GitHub Desktop.
Messing with DHASH

Use DHASH to compare images

Based on this repo:

https://github.com/Jetsetter/dhash.git

I categorised a bunch of images and had a play with this PIP repo to see whether it could tell the difference between images that are quite similat

Conclusion

This could work but may need to be tuned a bit.

Even very similar photos can give a difference score of 45-50. Completely different images giving a difference of ~50.

#! /usr/bin/env python
import glob
import dhash
from PIL import Image
testfiledir="/Users/jameshook/data/test_dhash/*.JPG"
files = glob.glob(testfiledir)
def calc_dhash( filename ):
image = Image.open(filename)
hash_d = dhash.dhash_int(image)
return ( filename , hash_d )
def calc_delta( h1 , h2 ):
return dhash.get_num_bits_different( h1 , h2 )
def calc_deltas( files , file ):
return [ ( f1[0] , file[0] , calc_delta( f1[1] , file[1] )) for f1 in files ]
def display_grid( grid ):
for f in grid:
print "==============================="
print f[0]
print "======"
sorted_hashes = sorted( f[1], key=lambda delta: delta[2] )
for s in sorted_hashes:
print "%s %s" % ( s[0] , s[2] )
hashes = map( calc_dhash , files)
print "HASHES"
print "======"
print hashes
print "DELTAS"
print "======"
grid = [ ( f1 , calc_deltas( hashes , f1 ) ) for f1 in hashes ]
display_grid( grid )
HASHES
======
[('/Users/jameshook/data/test_dhash/class_2_1.JPG', 133444065540591572424685057146254969621L), ('/Users/jameshook/data/test_dhash/class_2_2.JPG', 288155882796435360591608754682148608983L), ('/Users/jameshook/data/test_dhash/class_4_1.JPG', 208172743778867845890888275352708787980L), ('/Users/jameshook/data/test_dhash/class_4_2.JPG', 41523451140898682701094046611791445839L), ('/Users/jameshook/data/test_dhash/class_1_1.JPG', 144119612009837309271364984800538487105L), ('/Users/jameshook/data/test_dhash/class_3_2.JPG', 150705215361708422803300784528586672896L), ('/Users/jameshook/data/test_dhash/class_1_2.JPG', 135810795512037234261205901712547742471L), ('/Users/jameshook/data/test_dhash/class_1_3.JPG', 144797399067380238615026752257795721473L), ('/Users/jameshook/data/test_dhash/class_3_1.JPG', 150788292111482414106044836724741491076L), ('/Users/jameshook/data/test_dhash/class_1_4.JPG', 285734173071906646471869495980529811472L), ('/Users/jameshook/data/test_dhash/class_5_1.JPG', 47874767624787918727612730191534344449L)]
DELTAS
======
===============================
('/Users/jameshook/data/test_dhash/class_2_1.JPG', 133444065540591572424685057146254969621L)
======
/Users/jameshook/data/test_dhash/class_2_1.JPG 0
/Users/jameshook/data/test_dhash/class_1_1.JPG 38
/Users/jameshook/data/test_dhash/class_1_2.JPG 42
/Users/jameshook/data/test_dhash/class_5_1.JPG 44
/Users/jameshook/data/test_dhash/class_1_3.JPG 47
/Users/jameshook/data/test_dhash/class_3_1.JPG 51
/Users/jameshook/data/test_dhash/class_1_4.JPG 51
/Users/jameshook/data/test_dhash/class_2_2.JPG 52
/Users/jameshook/data/test_dhash/class_3_2.JPG 57
/Users/jameshook/data/test_dhash/class_4_2.JPG 68
/Users/jameshook/data/test_dhash/class_4_1.JPG 70
===============================
('/Users/jameshook/data/test_dhash/class_2_2.JPG', 288155882796435360591608754682148608983L)
======
/Users/jameshook/data/test_dhash/class_2_2.JPG 0
/Users/jameshook/data/test_dhash/class_2_1.JPG 52
/Users/jameshook/data/test_dhash/class_1_1.JPG 52
/Users/jameshook/data/test_dhash/class_1_3.JPG 57
/Users/jameshook/data/test_dhash/class_3_2.JPG 61
/Users/jameshook/data/test_dhash/class_1_4.JPG 61
/Users/jameshook/data/test_dhash/class_3_1.JPG 63
/Users/jameshook/data/test_dhash/class_4_1.JPG 64
/Users/jameshook/data/test_dhash/class_5_1.JPG 66
/Users/jameshook/data/test_dhash/class_1_2.JPG 68
/Users/jameshook/data/test_dhash/class_4_2.JPG 70
===============================
('/Users/jameshook/data/test_dhash/class_4_1.JPG', 208172743778867845890888275352708787980L)
======
/Users/jameshook/data/test_dhash/class_4_1.JPG 0
/Users/jameshook/data/test_dhash/class_4_2.JPG 52
/Users/jameshook/data/test_dhash/class_3_2.JPG 59
/Users/jameshook/data/test_dhash/class_3_1.JPG 61
/Users/jameshook/data/test_dhash/class_5_1.JPG 62
/Users/jameshook/data/test_dhash/class_2_2.JPG 64
/Users/jameshook/data/test_dhash/class_1_1.JPG 64
/Users/jameshook/data/test_dhash/class_1_2.JPG 64
/Users/jameshook/data/test_dhash/class_1_3.JPG 65
/Users/jameshook/data/test_dhash/class_1_4.JPG 65
/Users/jameshook/data/test_dhash/class_2_1.JPG 70
===============================
('/Users/jameshook/data/test_dhash/class_4_2.JPG', 41523451140898682701094046611791445839L)
======
/Users/jameshook/data/test_dhash/class_4_2.JPG 0
/Users/jameshook/data/test_dhash/class_4_1.JPG 52
/Users/jameshook/data/test_dhash/class_1_1.JPG 62
/Users/jameshook/data/test_dhash/class_1_3.JPG 67
/Users/jameshook/data/test_dhash/class_2_1.JPG 68
/Users/jameshook/data/test_dhash/class_1_2.JPG 68
/Users/jameshook/data/test_dhash/class_2_2.JPG 70
/Users/jameshook/data/test_dhash/class_1_4.JPG 71
/Users/jameshook/data/test_dhash/class_5_1.JPG 74
/Users/jameshook/data/test_dhash/class_3_2.JPG 77
/Users/jameshook/data/test_dhash/class_3_1.JPG 77
===============================
('/Users/jameshook/data/test_dhash/class_1_1.JPG', 144119612009837309271364984800538487105L)
======
/Users/jameshook/data/test_dhash/class_1_1.JPG 0
/Users/jameshook/data/test_dhash/class_2_1.JPG 38
/Users/jameshook/data/test_dhash/class_1_2.JPG 40
/Users/jameshook/data/test_dhash/class_1_3.JPG 43
/Users/jameshook/data/test_dhash/class_5_1.JPG 48
/Users/jameshook/data/test_dhash/class_2_2.JPG 52
/Users/jameshook/data/test_dhash/class_3_2.JPG 57
/Users/jameshook/data/test_dhash/class_1_4.JPG 57
/Users/jameshook/data/test_dhash/class_3_1.JPG 61
/Users/jameshook/data/test_dhash/class_4_2.JPG 62
/Users/jameshook/data/test_dhash/class_4_1.JPG 64
===============================
('/Users/jameshook/data/test_dhash/class_3_2.JPG', 150705215361708422803300784528586672896L)
======
/Users/jameshook/data/test_dhash/class_3_2.JPG 0
/Users/jameshook/data/test_dhash/class_3_1.JPG 22
/Users/jameshook/data/test_dhash/class_5_1.JPG 39
/Users/jameshook/data/test_dhash/class_1_2.JPG 53
/Users/jameshook/data/test_dhash/class_1_3.JPG 54
/Users/jameshook/data/test_dhash/class_2_1.JPG 57
/Users/jameshook/data/test_dhash/class_1_1.JPG 57
/Users/jameshook/data/test_dhash/class_4_1.JPG 59
/Users/jameshook/data/test_dhash/class_1_4.JPG 60
/Users/jameshook/data/test_dhash/class_2_2.JPG 61
/Users/jameshook/data/test_dhash/class_4_2.JPG 77
===============================
('/Users/jameshook/data/test_dhash/class_1_2.JPG', 135810795512037234261205901712547742471L)
======
/Users/jameshook/data/test_dhash/class_1_2.JPG 0
/Users/jameshook/data/test_dhash/class_1_1.JPG 40
/Users/jameshook/data/test_dhash/class_2_1.JPG 42
/Users/jameshook/data/test_dhash/class_1_4.JPG 47
/Users/jameshook/data/test_dhash/class_1_3.JPG 49
/Users/jameshook/data/test_dhash/class_5_1.JPG 50
/Users/jameshook/data/test_dhash/class_3_2.JPG 53
/Users/jameshook/data/test_dhash/class_3_1.JPG 55
/Users/jameshook/data/test_dhash/class_4_1.JPG 64
/Users/jameshook/data/test_dhash/class_2_2.JPG 68
/Users/jameshook/data/test_dhash/class_4_2.JPG 68
===============================
('/Users/jameshook/data/test_dhash/class_1_3.JPG', 144797399067380238615026752257795721473L)
======
/Users/jameshook/data/test_dhash/class_1_3.JPG 0
/Users/jameshook/data/test_dhash/class_1_4.JPG 42
/Users/jameshook/data/test_dhash/class_1_1.JPG 43
/Users/jameshook/data/test_dhash/class_2_1.JPG 47
/Users/jameshook/data/test_dhash/class_1_2.JPG 49
/Users/jameshook/data/test_dhash/class_3_2.JPG 54
/Users/jameshook/data/test_dhash/class_2_2.JPG 57
/Users/jameshook/data/test_dhash/class_5_1.JPG 57
/Users/jameshook/data/test_dhash/class_3_1.JPG 60
/Users/jameshook/data/test_dhash/class_4_1.JPG 65
/Users/jameshook/data/test_dhash/class_4_2.JPG 67
===============================
('/Users/jameshook/data/test_dhash/class_3_1.JPG', 150788292111482414106044836724741491076L)
======
/Users/jameshook/data/test_dhash/class_3_1.JPG 0
/Users/jameshook/data/test_dhash/class_3_2.JPG 22
/Users/jameshook/data/test_dhash/class_5_1.JPG 41
/Users/jameshook/data/test_dhash/class_2_1.JPG 51
/Users/jameshook/data/test_dhash/class_1_2.JPG 55
/Users/jameshook/data/test_dhash/class_1_3.JPG 60
/Users/jameshook/data/test_dhash/class_1_4.JPG 60
/Users/jameshook/data/test_dhash/class_4_1.JPG 61
/Users/jameshook/data/test_dhash/class_1_1.JPG 61
/Users/jameshook/data/test_dhash/class_2_2.JPG 63
/Users/jameshook/data/test_dhash/class_4_2.JPG 77
===============================
('/Users/jameshook/data/test_dhash/class_1_4.JPG', 285734173071906646471869495980529811472L)
======
/Users/jameshook/data/test_dhash/class_1_4.JPG 0
/Users/jameshook/data/test_dhash/class_1_3.JPG 42
/Users/jameshook/data/test_dhash/class_1_2.JPG 47
/Users/jameshook/data/test_dhash/class_2_1.JPG 51
/Users/jameshook/data/test_dhash/class_1_1.JPG 57
/Users/jameshook/data/test_dhash/class_3_2.JPG 60
/Users/jameshook/data/test_dhash/class_3_1.JPG 60
/Users/jameshook/data/test_dhash/class_2_2.JPG 61
/Users/jameshook/data/test_dhash/class_5_1.JPG 63
/Users/jameshook/data/test_dhash/class_4_1.JPG 65
/Users/jameshook/data/test_dhash/class_4_2.JPG 71
===============================
('/Users/jameshook/data/test_dhash/class_5_1.JPG', 47874767624787918727612730191534344449L)
======
/Users/jameshook/data/test_dhash/class_5_1.JPG 0
/Users/jameshook/data/test_dhash/class_3_2.JPG 39
/Users/jameshook/data/test_dhash/class_3_1.JPG 41
/Users/jameshook/data/test_dhash/class_2_1.JPG 44
/Users/jameshook/data/test_dhash/class_1_1.JPG 48
/Users/jameshook/data/test_dhash/class_1_2.JPG 50
/Users/jameshook/data/test_dhash/class_1_3.JPG 57
/Users/jameshook/data/test_dhash/class_4_1.JPG 62
/Users/jameshook/data/test_dhash/class_1_4.JPG 63
/Users/jameshook/data/test_dhash/class_2_2.JPG 66
/Users/jameshook/data/test_dhash/class_4_2.JPG 74
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment