Expand description

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:

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:

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

Structs

An area of an image that has been forged.
A mask that represents the pixels of an image that have been forged
A grid is an unsigned integer between 0 and 63
Contains the result for the detection of missing grid areas
The grid origin vote map of an image.
JPEG grid detector applied to forgery detection.

Enums

Represents the errors that can be raised when using Zero.
The result of the vote to which grid a pixel is aligned with.