### 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 |

#**109** in Images

**88** downloads per month

Used in **3** crates

**MIT**license

**1.5MB**

779 lines

# blockhash

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

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

## 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