#jpeg #image-processing #forgery-detection #image-forensics

forgery-detection-zero

JPEG grid detector applied to forgery detection in digital images

3 releases (breaking)

0.3.0 Dec 11, 2022
0.2.0 Nov 30, 2022
0.1.0 Nov 17, 2022

#725 in Images

AGPL-3.0-or-later

36KB
645 lines

forgery-detection-zero

An implementation of ZERO: a JPEG grid detector applied to forgery detection in digital images.

The approach is described in the following paper:

Tina Nikoukhah, Jérémy Anger, Miguel Colom, Jean-Michel Morel, and Rafael Grompone von Gioi,
ZERO: a Local JPEG Grid Origin Detector Based on the Number of DCT Zeros and its Applications in Image Forensics,
Image Processing On Line, 11 (2021), pp. 396–433. https://doi.org/10.5201/ipol.2021.390

The original implementation is written in C.

Library example

Simple usage:

# use forgery_detection_zero::Zero;
# let jpeg = todo!();
#
for r in Zero::from_image(&jpeg).into_iter() {
    println!(
        "Forged region detected: from ({}, {}) to ({}, {})",
        r.start.0, r.start.1, r.end.0, r.end.1,
    )
}

More advanced usage:

# use forgery_detection_zero::Zero;
# let jpeg = todo!();
#
let foreign_grid_areas = Zero::from_image(&jpeg).detect_forgeries();
let missing_grid_areas = foreign_grid_areas
    .detect_missing_grid_areas()
    .unwrap()
    .unwrap();
let forged_regions = foreign_grid_areas
    .forged_regions()
    .iter()
    .chain(missing_grid_areas.forged_regions());
for r in forged_regions {
    println!(
        "Forged region detected: from ({}, {}) to ({}, {})",
        r.start.0, r.start.1, r.end.0, r.end.1,
    )
}

CLI example

You can use the example to generate the forgery masks of an image:

cargo r --release --example zero image.jpg

Dependencies

~9MB
~145K SLoC