Crate image_compare
source ·Expand description
§Comparing gray images using structure
This crate allows to compare grayscale images using either structure or histogramming methods. The easiest use is loading two images, converting them to grayscale and running a comparison:
use image_compare::Algorithm;
let image_one = image::open("image1.png").expect("Could not find test-image").into_luma8();
let image_two = image::open("image2.png").expect("Could not find test-image").into_luma8();
let result = image_compare::gray_similarity_structure(&Algorithm::MSSIMSimple, &image_one, &image_two).expect("Images had different dimensions");
Check the Algorithm
enum for implementation details
§Comparing gray images using histogram
Histogram comparisons are possible using the histogram comparison function
use image_compare::Metric;
let image_one = image::open("image1.png").expect("Could not find test-image").into_luma8();
let image_two = image::open("image2.png").expect("Could not find test-image").into_luma8();
let result = image_compare::gray_similarity_histogram(Metric::Hellinger, &image_one, &image_two).expect("Images had different dimensions");
Check the Metric
enum for implementation details
§Comparing rgb images using hybrid mode
hybrid mode allows to decompose the image to structure and color channels (YUV) which are compared separately but then combined into a common result.
§Direct usage on two RGB8 images
let image_one = image::open("image1.png").expect("Could not find test-image").into_rgb8();
let image_two = image::open("image2.png").expect("Could not find test-image").into_rgb8();
let result = image_compare::rgb_hybrid_compare(&image_one, &image_two).expect("Images had different dimensions");
§Compare the similarity of two maybe-rgba images in front a given background color
If an image is RGBA it will be blended with a background of the given color. RGB images will not be modified.
use image::Rgb;
let image_one = image::open("image1.png").expect("Could not find test-image").into_rgba8();
let image_two = image::open("image2.png").expect("Could not find test-image").into_rgb8();
let white = Rgb([255,255,255]);
let result = image_compare::rgba_blended_hybrid_compare((&image_one).into(), (&image_two).into(), white).expect("Images had different dimensions");
§Comparing two RGBA8 images using hybrid mode
hybrid mode allows to decompose the image to structure, color and alpha channels (YUVA) which are compared separately but then combined into a common result.
let image_one = image::open("image1.png").expect("Could not find test-image").into_rgba8();
let image_two = image::open("image2.png").expect("Could not find test-image").into_rgba8();
let result = image_compare::rgba_hybrid_compare(&image_one, &image_two).expect("Images had different dimensions");
§Using structure results
All structural comparisons return a result struct that contains the similarity score. For the score 1.0 is perfectly similar, 0.0 is dissimilar and some algorithms even provide up to -1.0 for inverse. Furthermore, the algorithm may produce a similarity map (MSSIM, RMS and hybrid compare do) that can be evaluated per pixel or converted to a visualization:
let image_one = image::open("image1.png").expect("Could not find test-image").into_rgba8();
let image_two = image::open("image2.png").expect("Could not find test-image").into_rgba8();
let result = image_compare::rgba_hybrid_compare(&image_one, &image_two).expect("Images had different dimensions");
if result.score < 0.95 {
let diff_img = result.image.to_color_map();
diff_img.save("diff_image.png").expect("Could not save diff image");
}
Structs§
- the resulting struct containing both an image of per pixel diffs as well as an average score
Enums§
- The enum for selecting a grayscale comparison implementation
- A wrapper class accepting both RgbaImage and RgbImage for the blended hybrid comparison
- The errors that can occur during comparison of the images
- The distance metric choices for histogram comparisons
Functions§
- Comparing gray images using histogram
- Comparing gray images using structure.
- Comparing structure via MSSIM on Y channel, comparing color-diff-vectors on U and V summing the squares Please mind that the RGBSimilarity-Image does not contain plain RGB here
- Comparing rgb images using structure. RGB structure similarity is performed by doing a channel split and taking the maximum deviation (minimum similarity) for the result. The image contains the complete deviations.
- This processes the RGBA images be pre-blending the colors with the desired background color. It’s faster then the full RGBA similarity and more intuitive.
- Hybrid comparison for RGBA images. Will do MSSIM on luma, then RMS on U and V and alpha channels. The calculation of the score is then pixel-wise the minimum of each pixels similarity. To account for perceived indifference in lower alpha regions, this down-weights the difference linearly with mean alpha channel.