Skip to content

jaehl/blockhash

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

34 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

blockhash

Crates.io CI status MIT License

This is an implementation of the Blockhash algorithm for detecting similar images, and can produce 16-, 64-, 144-, and 256-bit perceptual hashes.

Support for the image crate is provided by default, but support for any image type can be easily added.

Documentation

Usage

use blockhash::blockhash64;

let img = image::open("images/example.png").unwrap();
let hash = blockhash64(&img);

assert_eq!(hash.to_string(), "c7c48f8989c77e0c");

The Blockhash algorithm

This is a basic outline of how the algorithm works. Note that this explanation uses floating-point numbers, but the library itself only uses integer operations in order to avoid any rounding errors.

To demonstrate the algorithm, we will calculate the 64-bit hash of the following image:

First we convert it to a grayscale image by taking the average of the red, green, and blue components:

Then we divide the image into 64 (8×8) blocks and calculate the average brightness for all the pixels in each block:

Next, we divide the blocks into 4 horizontal bands and find the median value for each band:

Blocks brighter than the median represent a 1 and blocks darker than the median represent a 0. This gives us the 64 bits of the hash, read from left to right, top to bottom:

We can represent the hash as a hexadecimal string:

c7c48f8989c77e0c

License

This project is licensed under the MIT license.

About

A perceptual hashing algorithm for detecting similar images.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages