ImageSharp icon indicating copy to clipboard operation
ImageSharp copied to clipboard

Expose ImageComparer API

Open antonfirsov opened this issue 4 years ago • 7 comments

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?

antonfirsov avatar Feb 26 '20 21:02 antonfirsov

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.

johanbenschop avatar Feb 26 '20 21:02 johanbenschop

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! 👍

antonfirsov avatar Feb 26 '20 21:02 antonfirsov

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:

  • return gray if pixels are equal
  • return Black if top is less than bottom
  • otherwise return White

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

atruskie avatar Apr 19 '20 23:04 atruskie

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.

brickman1444 avatar Jun 20 '21 19:06 brickman1444

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

bkolo avatar Sep 22 '22 17:09 bkolo

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.

antonfirsov avatar Sep 22 '22 21:09 antonfirsov

@coenm wrote a library for hashing years ago.

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

JimBobSquarePants avatar Sep 25 '22 01:09 JimBobSquarePants