diff options
author | Brad Pitcher <bradpitcher@gmail.com> | 2011-11-01 18:29:29 (GMT) |
---|---|---|
committer | Brad Pitcher <bradpitcher@gmail.com> | 2011-11-01 18:29:29 (GMT) |
commit | 0eacddfd8148f14ee0ddfe2eb66b82774c88afbe (patch) | |
tree | 6982ea59564090ea858d12d86d3699e83887f1f9 /tests/yee_compare.h | |
parent | ea7e4988d44249946b620d5973b230cf1a0606ca (diff) | |
parent | e2caf3726d68ff1fef63113519049abffc0563af (diff) |
merge master
Diffstat (limited to 'tests/yee_compare.h')
-rw-r--r-- | tests/yee_compare.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/tests/yee_compare.h b/tests/yee_compare.h new file mode 100644 index 0000000..041ae4c --- /dev/null +++ b/tests/yee_compare.h @@ -0,0 +1,126 @@ +#ifndef _yee_compare_h +#define _yee_compare_h + +// source code modified for OpenSCAD, Sept 2011 +// original copyright notice follows: +/* +Metric +RGBAImage.h +Comapre Args +Laplacian Pyramid +Copyright (C) 2006 Yangli Hector Yee + +This program is free software; you can redistribute it and/or modify it under the terms of the +GNU General Public License as published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; +if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +#include <string> + +class RGBAImage; + +// Args to pass into the comparison function +class CompareArgs +{ +public: + CompareArgs(); + ~CompareArgs(); + bool Parse_Args(int argc, char **argv); + void Print_Args(); + + RGBAImage *ImgA; // Image A + RGBAImage *ImgB; // Image B + RGBAImage *ImgDiff; // Diff image + bool Verbose; // Print lots of text or not + bool LuminanceOnly; // Only consider luminance; ignore chroma channels in the comparison. + float FieldOfView; // Field of view in degrees + float Gamma; // The gamma to convert to linear color space + float Luminance; // the display's luminance + unsigned int ThresholdPixels; // How many pixels different to ignore + std::string ErrorStr; // Error string + // How much color to use in the metric. + // 0.0 is the same as LuminanceOnly = true, + // 1.0 means full strength. + float ColorFactor; + // How much to down sample image before comparing, in powers of 2. + int DownSample; +}; + +#define MAX_PYR_LEVELS 8 + +class LPyramid +{ +public: + LPyramid(float *image, int width, int height); + virtual ~LPyramid(); + float Get_Value(int x, int y, int level); +protected: + float *Copy(float *img); + void Convolve(float *a, float *b); + + // Succesively blurred versions of the original image + float *Levels[MAX_PYR_LEVELS]; + + int Width; + int Height; +}; + +class CompareArgs; + +// Image comparison metric using Yee's method +// References: A Perceptual Metric for Production Testing, Hector Yee, Journal of Graphics Tools 2004 +bool Yee_Compare(CompareArgs &args); + +/** Class encapsulating an image containing R,G,B,A channels. + * + * Internal representation assumes data is in the ABGR format, with the RGB + * color channels premultiplied by the alpha value. Premultiplied alpha is + * often also called "associated alpha" - see the tiff 6 specification for some + * discussion - http://partners.adobe.com/asn/developer/PDFS/TN/TIFF6.pdf + * + */ +class RGBAImage +{ + RGBAImage(const RGBAImage&); + RGBAImage& operator=(const RGBAImage&); +public: + RGBAImage(int w, int h, const char *name = 0) + { + Width = w; + Height = h; + if (name) Name = name; + Data = new unsigned int[w * h]; + }; + ~RGBAImage() { if (Data) delete[] Data; } + unsigned char Get_Red(unsigned int i) { return (Data[i] & 0xFF); } + unsigned char Get_Green(unsigned int i) { return ((Data[i]>>8) & 0xFF); } + unsigned char Get_Blue(unsigned int i) { return ((Data[i]>>16) & 0xFF); } + unsigned char Get_Alpha(unsigned int i) { return ((Data[i]>>24) & 0xFF); } + void Set(unsigned char r, unsigned char g, unsigned char b, unsigned char a, unsigned int i) + { Data[i] = r | (g << 8) | (b << 16) | (a << 24); } + int Get_Width(void) const { return Width; } + int Get_Height(void) const { return Height; } + void Set(int x, int y, unsigned int d) { Data[x + y * Width] = d; } + unsigned int Get(int x, int y) const { return Data[x + y * Width]; } + unsigned int Get(int i) const { return Data[i]; } + const std::string &Get_Name(void) const { return Name; } + RGBAImage* DownSample() const; + + bool WriteToFile(const char* filename); + static RGBAImage* ReadFromFile(const char* filename); + +protected: + int Width; + int Height; + std::string Name; + unsigned int *Data; +}; + +#endif |