blockhash 1.0.0

A perceptual hashing algorithm for detecting similar images.
Documentation
#![feature(test)]
#![cfg(feature = "image")]

extern crate test;

use blockhash::*;
use image::DynamicImage;
use test::Bencher;

macro_rules! bench_impl {
    ($name:ident, $func:ident, $path:expr) => {
        #[bench]
        fn $name(bencher: &mut Bencher) {
            let im = image::open(concat!("images/", $path, ".png")).unwrap();

            // Avoid the overhead of DynamicImage for a more accurate benchmark
            bencher.iter(|| match &im {
                DynamicImage::ImageLuma8(im) => $func(im),
                DynamicImage::ImageLumaA8(im) => $func(im),
                DynamicImage::ImageRgb8(im) => $func(im),
                DynamicImage::ImageRgb16(im) => $func(im),
                _ => unimplemented!(),
            });
        }
    };
}

bench_impl!(blockhash16_512x512_y, blockhash16, "512x512_y");
bench_impl!(blockhash16_241x159_ya, blockhash16, "241x159_ya");
bench_impl!(blockhash16_256x256_rgb, blockhash16, "256x256_rgb");
bench_impl!(blockhash16_450x300_rgb, blockhash16, "450x300_rgb");
bench_impl!(blockhash16_512x512_rgb, blockhash16, "512x512_rgb");
bench_impl!(blockhash16_256x256_rgb16, blockhash16, "256x256_rgb16");

bench_impl!(blockhash64_512x512_y, blockhash64, "512x512_y");
bench_impl!(blockhash64_241x159_ya, blockhash64, "241x159_ya");
bench_impl!(blockhash64_256x256_rgb, blockhash64, "256x256_rgb");
bench_impl!(blockhash64_450x300_rgb, blockhash64, "450x300_rgb");
bench_impl!(blockhash64_512x512_rgb, blockhash64, "512x512_rgb");
bench_impl!(blockhash64_256x256_rgb16, blockhash64, "256x256_rgb16");

bench_impl!(blockhash144_512x512_y, blockhash144, "512x512_y");
bench_impl!(blockhash144_241x159_ya, blockhash144, "241x159_ya");
bench_impl!(blockhash144_256x256_rgb, blockhash144, "256x256_rgb");
bench_impl!(blockhash144_450x300_rgb, blockhash144, "450x300_rgb");
bench_impl!(blockhash144_512x512_rgb, blockhash144, "512x512_rgb");
bench_impl!(blockhash144_256x256_rgb16, blockhash144, "256x256_rgb16");

bench_impl!(blockhash256_512x512_y, blockhash256, "512x512_y");
bench_impl!(blockhash256_241x159_ya, blockhash256, "241x159_ya");
bench_impl!(blockhash256_256x256_rgb, blockhash256, "256x256_rgb");
bench_impl!(blockhash256_450x300_rgb, blockhash256, "450x300_rgb");
bench_impl!(blockhash256_512x512_rgb, blockhash256, "512x512_rgb");
bench_impl!(blockhash256_256x256_rgb16, blockhash256, "256x256_rgb16");