#perceptual #hash #fingerprint

no-std blockhash

A perceptual hashing algorithm for detecting similar images

6 releases (1 stable)

1.0.0 Apr 8, 2024
0.5.0 Sep 17, 2022
0.4.0 Mar 29, 2022
0.3.0 Aug 12, 2021
0.1.0 May 14, 2020

#128 in Images

Download history 14/week @ 2024-01-25 12/week @ 2024-02-01 24/week @ 2024-02-08 28/week @ 2024-02-15 468/week @ 2024-02-22 76/week @ 2024-02-29 72/week @ 2024-03-07 48/week @ 2024-03-14 81/week @ 2024-03-21 41/week @ 2024-03-28 134/week @ 2024-04-04 56/week @ 2024-04-11 24/week @ 2024-04-18 26/week @ 2024-04-25 16/week @ 2024-05-02 8/week @ 2024-05-09

77 downloads per month
Used in 3 crates

MIT license

1.5MB
779 lines

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.

Dependencies

~11MB
~51K SLoC