corona10/goimagehash

How to saved hashes for future comparison?

Opened this issue · 1 comments

k0fi commented

After I get an image hashed:

	hash1, err := goimagehash.AverageHash(img1)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("hash of image is:", hash1)
	fmt.Println("hash1.ToString():", hash1.ToString())

I get

hash of image is: &{9222170938831798272 1}
hash1.ToString(): a:7ffbbb9b93000000

My problem is how to save hash1 in database, so that later on I can retrive it and compare its distance with newly computed hash2 using:

distance, _ := hash1.Distance(hash2)

Not an authoritative answer, but you can save your hash value as separate columns :


// Golang :
// DigitalAssetSrc data dbmodel (ex. a raw image)
type DigitalAssetSrc struct {
	gorm.Model
	AverageHash uint64
	DifferenceHash uint64
	PerceptionHash uint64
...

// compute thumbnail hashes for similarity indexing
	averageHash, _ := goimagehash.AverageHash(thumbnail)
	differenceHash, _ := goimagehash.DifferenceHash(thumbnail)
	perceptionHash, _ := goimagehash.PerceptionHash(thumbnail)
	asset.AverageHash = averageHash.GetHash()
	asset.DifferenceHash = differenceHash.GetHash()
	asset.PerceptionHash = perceptionHash.GetHash()


// DB :
CREATE TABLE digital_asset_srcs
(
    id bigint NOT NULL DEFAULT nextval('digital_asset_srcs_id_seq'::regclass),
    average_hash bigint,
    difference_hash bigint,
    perception_hash bigint,
...

Then you can either reload those image hashes for comparison, on you can try and use K-nearest neighbour search with Hamming distance if you backend database supports it.