SixLabors / ImageSharp

:camera: A modern, cross-platform, 2D Graphics library for .NET
https://sixlabors.com/products/imagesharp/
Other
7.46k stars 851 forks source link

Expose ImageComparer API #1129

Open antonfirsov opened 4 years ago

antonfirsov commented 4 years ago

The image comparison logic implemented in TolerantImageComparer might be interesting for users, eg. for testing purposes.

We should expose a similar feature from the core library.

The current ImageComparer API returns a list of detected pixel differences, which did not turn out to be useful. Shouldn't we return a difference image instead? Or should we return both?

johanbenschop commented 4 years ago

I would be very interested in this feature. What I'm currently looking for is the ability to compare a known good image with one that was just generated in a unit test and look whether they're the same or at least close enough. I would prefer a percentage of how much difference there is (like a summary of what PixelDifference is now).

A difference image would be useful to see what changed I suppose, but I don't quite see how this is would work inside a test.

antonfirsov commented 4 years ago

You can call differnceImage.Save(...) to save it for manual analysis. In our test infrastructure we have a .DebugSave(...) extension method to save images to a dedicated artifact folder locally which is super useful, even without the difference image. On CI that method is a NOP.

Since our backlog is full of high priority topics (both big and small), I can't promise that this API will become a thing anytime soon. Feel free to borrow our code until then, and thanks for the feedback! 👍

atruskie commented 4 years ago

I would be interested in this. I have had long had my own functions to do this and suffice to say, they are not that great.

RE difference image, I did a similar thing. I made a "DeltaImageProcesser" which my image comparer method uses. It is not a true difference image, but I've found it be diagnostically more useful, especially for very small differences. It boils down to:

The code is here if anyone is interested: https://github.com/QutEcoacoustics/audio-analysis/blob/b3741577a39a4a8982472a4ebcdecf8e227849a7/src/Acoustics.Shared/ImageSharp/DeltaPixelBlender.cs#L55-L64

Here is an example output:

Actual

TestNoAADrawLineDiagonalMultiplePoints_actual

Delta

TestNoAADrawLineDiagonalMultiplePoints_delta

Expected

TestNoAADrawLineDiagonalMultiplePoints_expected

brickman1444 commented 3 years ago

I'd also be interested in this feature. I maintain an application that composes images like this using ImageSharp. image

I have some tests covering the process end to end to make sure nothing breaks during refactors but I had to write the comparison myself and dial down the tolerance because I don't think I wrote it correctly.

bkolo commented 2 years ago

how about the ability to fingerprint image for a large library of images to identify similar images using a stored hash in a database

antonfirsov commented 2 years ago

ImageComparer intends to define a numeric similarity metric to measure difference between two images, it's primary use-case is testing.

Image fingerprinting / hashing is a related, but different feature. If this is something you are seriously interested in and you can give us ideas with specific algorithms or examples from other projects in mind, I recommend opening an Idea Discussion providing as much info and context as you can.

JimBobSquarePants commented 2 years ago

@coenm wrote a library for hashing years ago.

https://www.nuget.org/packages/CoenM.ImageSharp.ImageHash