Open CASCADE Technology 7.8.2.dev
Image_Diff Class Reference

This class compares two images pixel-by-pixel. It uses the following methods to ignore the difference between images: More...

#include <Image_Diff.hxx>

Inheritance diagram for Image_Diff:

Public Member Functions

 Image_Diff ()
 An empty constructor. Init() should be called for initialization.
 
virtual ~Image_Diff ()
 Destructor.
 
Standard_Boolean Init (const Handle< Image_PixMap > &theImageRef, const Handle< Image_PixMap > &theImageNew, const Standard_Boolean theToBlackWhite=Standard_False)
 Initialize algorithm by two images.
 
Standard_Boolean Init (const TCollection_AsciiString &theImgPathRef, const TCollection_AsciiString &theImgPathNew, const Standard_Boolean theToBlackWhite=Standard_False)
 Initialize algorithm by two images (will be loaded from files).
 
void SetColorTolerance (const Standard_Real theTolerance)
 Color tolerance for equality check. Should be within range 0..1: Corresponds to a difference between white and black colors (maximum difference). By default, the tolerance is equal to 0 thus equality check will return false for any different colors.
 
Standard_Real ColorTolerance () const
 Color tolerance for equality check.
 
void SetBorderFilterOn (const Standard_Boolean theToIgnore)
 Sets taking into account (ignoring) a "border effect" on comparison of images. The border effect is caused by a border of shaded shapes in the viewer 3d. Triangles of this area are located at about 0 or 90 degrees to the user. Therefore, they deflect light differently according to implementation of a video card driver. This flag allows to detect such a "border" area and skip it from comparison of images. Filter turned OFF by default.
 
Standard_Boolean IsBorderFilterOn () const
 Returns a flag of taking into account (ignoring) a border effect in comparison of images.
 
Standard_Integer Compare ()
 Compares two images. It returns a number of different pixels (or groups of pixels). It returns -1 if algorithm not initialized before.
 
Standard_Boolean SaveDiffImage (Image_PixMap &theDiffImage) const
 Saves a difference between two images as white pixels on black background.
 
Standard_Boolean SaveDiffImage (const TCollection_AsciiString &theDiffPath) const
 Saves a difference between two images as white pixels on black background.
 
- Public Member Functions inherited from Standard_Transient
 Standard_Transient ()
 Empty constructor.
 
 Standard_Transient (const Standard_Transient &)
 Copy constructor – does nothing.
 
Standard_Transientoperator= (const Standard_Transient &)
 Assignment operator, needed to avoid copying reference counter.
 
virtual ~Standard_Transient ()
 Destructor must be virtual.
 
virtual const opencascade::handle< Standard_Type > & DynamicType () const
 Returns a type descriptor about this object.
 
Standard_Boolean IsInstance (const opencascade::handle< Standard_Type > &theType) const
 Returns a true value if this is an instance of Type.
 
Standard_Boolean IsInstance (const Standard_CString theTypeName) const
 Returns a true value if this is an instance of TypeName.
 
Standard_Boolean IsKind (const opencascade::handle< Standard_Type > &theType) const
 Returns true if this is an instance of Type or an instance of any class that inherits from Type. Note that multiple inheritance is not supported by OCCT RTTI mechanism.
 
Standard_Boolean IsKind (const Standard_CString theTypeName) const
 Returns true if this is an instance of TypeName or an instance of any class that inherits from TypeName. Note that multiple inheritance is not supported by OCCT RTTI mechanism.
 
Standard_TransientThis () const
 Returns non-const pointer to this object (like const_cast). For protection against creating handle to objects allocated in stack or call from constructor, it will raise exception Standard_ProgramError if reference counter is zero.
 
Standard_Integer GetRefCount () const noexcept
 Get the reference counter of this object.
 
void IncrementRefCounter () noexcept
 Increments the reference counter of this object.
 
Standard_Integer DecrementRefCounter () noexcept
 Decrements the reference counter of this object; returns the decremented value.
 
virtual void Delete () const
 Memory deallocator for transient classes.
 

Protected Member Functions

Standard_Integer ignoreBorderEffect ()
 Perform border filter algorithm.
 
void releaseGroupsOfDiffPixels ()
 Release dynamically allocated memory.
 

Static Protected Member Functions

static Standard_Integer PackXY (uint16_t theX, uint16_t theY)
 Map two pixel coordinates to 32-bit integer.
 
static uint16_t UnpackX (Standard_Integer theXY)
 Get pixel X coordinate from 32-bit packed integer.
 
static uint16_t UnpackY (Standard_Integer theXY)
 Get pixel Y coordinate from 32-bit packed integer.
 

Protected Attributes

Handle< Image_PixMapmyImageRef
 reference image to compare (from)
 
Handle< Image_PixMapmyImageNew
 new image to compare (to)
 
Standard_Real myColorTolerance
 tolerance for equality check (0..1, 0 - any not equal, 1 - opposite colors)
 
Standard_Boolean myIsBorderFilterOn
 perform algorithm with border effect filter
 
NCollection_Vector< Standard_IntegermyDiffPixels
 coordinates of different pixels, packed in one int using 16-bit integers to save memory
 
TColStd_PackedMapOfInteger myLinearGroups
 
NCollection_List< Handle< TColStd_HPackedMapOfInteger > > myGroupsOfDiffPixels
 

Additional Inherited Members

- Public Types inherited from Standard_Transient
typedef void base_type
 Returns a type descriptor about this object.
 
- Static Public Member Functions inherited from Standard_Transient
static constexpr const char * get_type_name ()
 Returns a type descriptor about this object.
 
static const opencascade::handle< Standard_Type > & get_type_descriptor ()
 Returns type descriptor of Standard_Transient class.
 

Detailed Description

This class compares two images pixel-by-pixel. It uses the following methods to ignore the difference between images:

  • Black/White comparison. It makes the images 2-colored before the comparison.
  • Equality with tolerance. Colors of two pixels are considered the same if the difference of their color is less than a tolerance.
  • Border filter. The algorithm ignores alone independent pixels, which are different on both images, ignores the "border effect" - the difference caused by triangles located at angle about 0 or 90 degrees to the user.

Border filter ignores a difference in implementation of anti-aliasing and other effects on boundary of a shape. The triangles of a boundary zone are usually located so that their normals point aside the user (about 90 degree between the normal and the direction to the user's eye). Deflection of the light for such a triangle depends on implementation of the video driver. In order to skip this difference the following algorithm is used: a) "Different" pixels are grouped and checked on "one-pixel width line". indeed, the pixels may represent not a line, but any curve. But the width of this curve should be not more than a pixel. This group of pixels become a candidate to be ignored because of boundary effect. b) The group of pixels is checked on belonging to a "shape". Neighbour pixels are checked from the reference image. This test confirms a fact that the group of pixels belongs to a shape and represent a boundary of the shape. In this case the whole group of pixels is ignored (considered as same). Otherwise, the group of pixels may represent a geometrical curve in the viewer 3D and should be considered as "different".

References:

  1. http://pdiff.sourceforge.net/ypg01.pdf
  2. http://pdiff.sourceforge.net/metric.html
  3. http://www.cs.ucf.edu/~sumant/publications/sig99.pdf
  4. http://www.worldscientific.com/worldscibooks/10.1142/2641#t=toc (there is a list of articles and books in PDF format)

Constructor & Destructor Documentation

◆ Image_Diff()

Image_Diff::Image_Diff ( )

An empty constructor. Init() should be called for initialization.

◆ ~Image_Diff()

virtual Image_Diff::~Image_Diff ( )
virtual

Destructor.

Member Function Documentation

◆ ColorTolerance()

Standard_Real Image_Diff::ColorTolerance ( ) const
inline

Color tolerance for equality check.

◆ Compare()

Standard_Integer Image_Diff::Compare ( )

Compares two images. It returns a number of different pixels (or groups of pixels). It returns -1 if algorithm not initialized before.

◆ ignoreBorderEffect()

Standard_Integer Image_Diff::ignoreBorderEffect ( )
protected

Perform border filter algorithm.

◆ Init() [1/2]

Standard_Boolean Image_Diff::Init ( const Handle< Image_PixMap > & theImageRef,
const Handle< Image_PixMap > & theImageNew,
const Standard_Boolean theToBlackWhite = Standard_False )

Initialize algorithm by two images.

Returns
false if images has different or unsupported pixel format.

◆ Init() [2/2]

Standard_Boolean Image_Diff::Init ( const TCollection_AsciiString & theImgPathRef,
const TCollection_AsciiString & theImgPathNew,
const Standard_Boolean theToBlackWhite = Standard_False )

Initialize algorithm by two images (will be loaded from files).

Returns
false if images couldn't be opened or their format is unsupported.

◆ IsBorderFilterOn()

Standard_Boolean Image_Diff::IsBorderFilterOn ( ) const
inline

Returns a flag of taking into account (ignoring) a border effect in comparison of images.

◆ PackXY()

static Standard_Integer Image_Diff::PackXY ( uint16_t theX,
uint16_t theY )
inlinestaticprotected

Map two pixel coordinates to 32-bit integer.

◆ releaseGroupsOfDiffPixels()

void Image_Diff::releaseGroupsOfDiffPixels ( )
protected

Release dynamically allocated memory.

◆ SaveDiffImage() [1/2]

Standard_Boolean Image_Diff::SaveDiffImage ( const TCollection_AsciiString & theDiffPath) const

Saves a difference between two images as white pixels on black background.

◆ SaveDiffImage() [2/2]

Standard_Boolean Image_Diff::SaveDiffImage ( Image_PixMap & theDiffImage) const

Saves a difference between two images as white pixels on black background.

◆ SetBorderFilterOn()

void Image_Diff::SetBorderFilterOn ( const Standard_Boolean theToIgnore)
inline

Sets taking into account (ignoring) a "border effect" on comparison of images. The border effect is caused by a border of shaded shapes in the viewer 3d. Triangles of this area are located at about 0 or 90 degrees to the user. Therefore, they deflect light differently according to implementation of a video card driver. This flag allows to detect such a "border" area and skip it from comparison of images. Filter turned OFF by default.

◆ SetColorTolerance()

void Image_Diff::SetColorTolerance ( const Standard_Real theTolerance)
inline

Color tolerance for equality check. Should be within range 0..1: Corresponds to a difference between white and black colors (maximum difference). By default, the tolerance is equal to 0 thus equality check will return false for any different colors.

◆ UnpackX()

static uint16_t Image_Diff::UnpackX ( Standard_Integer theXY)
inlinestaticprotected

Get pixel X coordinate from 32-bit packed integer.

◆ UnpackY()

static uint16_t Image_Diff::UnpackY ( Standard_Integer theXY)
inlinestaticprotected

Get pixel Y coordinate from 32-bit packed integer.

Field Documentation

◆ myColorTolerance

Standard_Real Image_Diff::myColorTolerance
protected

tolerance for equality check (0..1, 0 - any not equal, 1 - opposite colors)

◆ myDiffPixels

NCollection_Vector<Standard_Integer> Image_Diff::myDiffPixels
protected

coordinates of different pixels, packed in one int using 16-bit integers to save memory

◆ myGroupsOfDiffPixels

NCollection_List< Handle< TColStd_HPackedMapOfInteger > > Image_Diff::myGroupsOfDiffPixels
protected

◆ myImageNew

Handle< Image_PixMap > Image_Diff::myImageNew
protected

new image to compare (to)

◆ myImageRef

Handle< Image_PixMap > Image_Diff::myImageRef
protected

reference image to compare (from)

◆ myIsBorderFilterOn

Standard_Boolean Image_Diff::myIsBorderFilterOn
protected

perform algorithm with border effect filter

◆ myLinearGroups

TColStd_PackedMapOfInteger Image_Diff::myLinearGroups
protected

The documentation for this class was generated from the following file: