Main Page Class Hierarchy Compound List File List Compound Members File Members

ImageComp.cc

Go to the documentation of this file.
00001 /*
00002 File: ImageComp.cc
00003 
00004 Function: Compare two image files
00005 
00006 Author: Andrew Willmott
00007 
00008 Notes: 
00009 */
00010 
00011 #include "cl/ArgParse.h"
00012 #include <stdlib.h>
00013 #include <unistd.h>
00014 
00015 #include "gcl/Image.h"
00016 #include "gcl/XGraphicsSystem.h"
00017 #include "cl/Action.h"
00018 
00019  Void ApplyToImageDiff(Action<ClrReal> &action, Image &image1, Image &image2,
00020 ImgChannel chn = chMono)
00021 {
00022 Int i, j;
00023 ClrReal temp;
00024 
00025 action.Start();
00026 
00027 for (i = 0; i < image1.Height(); i++)
00028 for (j = 0; j < image1.Width(); j++)
00029 {
00030 temp = image1.GetRealPixel(j, i, chn) - image2.GetRealPixel(j, i, chn);
00031 action.Process(temp);
00032 } 
00033 
00034 action.Stop();
00035 }
00036 
00037  ClrReal AbsImageDiff(Image &image1, Image &image2, Image &destImage)
00038 {
00039 Int i, j;
00040 Colour c;
00041 ClrReal maxCmpt = 0.0;
00042 
00043 for (i = 0; i < image1.Height(); i++)
00044 for (j = 0; j < image1.Width(); j++)
00045 {
00046 Colour a = image1.GetPixel(j, i);
00047 Colour b = image2.GetPixel(j, i);
00048 
00049 c = a - b;
00050 c[0] = abs(c[0]);
00051 c[1] = abs(c[1]);
00052 c[2] = abs(c[2]);
00053 
00054 maxCmpt = Max(maxCmpt, Max(c[0], Max(c[1], c[2])));
00055 destImage.SetPixel(j, i, c);
00056 }
00057 
00058 return(maxCmpt);
00059 }
00060 
00061 
00062 // --- Main Program -----------------------------------------------------------
00063 
00064 
00065  Int main(Int argc, Char **argv)
00066 {
00067 XGraphicsSystem *gs; 
00068 StatsFinder<ClrReal> rstats, bstats, gstats; 
00069 RGBAImage img1, img2, imgDiff; 
00070 XOffscreenPane *offImg; 
00071 XBackedPane *window; 
00072 FileName fpath; 
00073 Char *file1, *file2; 
00074 Int useWin, noFork;
00075 ClrReal maxCmpt;
00076 
00077 // command-line options
00078 
00079 if (arg_parse(argc, argv, 
00080 "", "usage: prog [options]",
00081 
00082 "%S", &file1, "image file 1",
00083 "%S", &file2, "image file 2",
00084 
00085 // Output options
00086 
00087 "-window", ARG_FLAG(&useWin), "display image differences in window",
00088 "-noFork", ARG_FLAG(&noFork), "Don't fork into background",
00089 0) < 0)
00090 exit(1);
00091 
00092 // Read two images
00093 
00094 fpath.SetPath(file1);
00095 if (img1.Load(fpath) != 0)
00096 exit(1);
00097 
00098 if (useWin)
00099 {
00100 #ifndef DEBUG
00101 if (!noFork && fork())
00102 return(0);
00103 #endif
00104 gs = new XGraphicsSystem;
00105 offImg = new XOffscreenPane;
00106 gs->CreateOffscreen(offImg, img1.Width(), img1.Height());
00107 window = new XBackedPane;
00108 gs->CreateWindow(window, "difference", img1.Width(), img1.Height());
00109 offImg->PutImage(img1);
00110 window->Attach(offImg);
00111 window->HandleExpose();
00112 gs->Spin();
00113 }
00114 
00115 fpath.SetPath(file2);
00116 if (img2.Load(fpath) != 0)
00117 exit(1);
00118 
00119 if (img2.Width() != img1.Width() || img2.Height() != img1.Height())
00120 {
00121 cerr << "Error: picture dimensions don't match." << endl;
00122 exit(1);
00123 }
00124 
00125 if (useWin)
00126 {
00127 offImg->PutImage(img2);
00128 window->HandleExpose();
00129 gs->Spin();
00130 }
00131 
00132 // Compare...
00133 
00134 ApplyToImageDiff(rstats, img1, img2, chRed);
00135 ApplyToImageDiff(gstats, img1, img2, chGreen);
00136 ApplyToImageDiff(bstats, img1, img2, chBlue);
00137 
00138 cout << "mean_R " << rstats.mean << endl;
00139 cout << "var_R " << rstats.variance << endl;
00140 cout << "dev_R " << sqrt(rstats.variance) << endl;
00141 cout << endl;
00142 cout << "mean_G " << gstats.mean << endl;
00143 cout << "var_G " << gstats.variance << endl;
00144 cout << "dev_G " << sqrt(gstats.variance) << endl;
00145 cout << endl;
00146 cout << "mean_B " << bstats.mean << endl;
00147 cout << "var_B " << bstats.variance << endl;
00148 cout << "dev_B " << sqrt(bstats.variance) << endl;
00149 cout << endl;
00150 cout << "mean_L " << dot(cRGBToLum, Colour(rstats.mean, gstats.mean, bstats.mean)) << endl;
00151 cout << "var_L " << dot(cRGBToLum, Colour(rstats.variance, gstats.variance, bstats.variance)) << endl;
00152 cout << "dev_L " << sqrt(dot(cRGBToLum, Colour(rstats.variance, gstats.variance, bstats.variance))) << endl;
00153 
00154 if (useWin)
00155 {
00156 imgDiff.SetSize(img1.Width(), img1.Height());
00157 maxCmpt = AbsImageDiff(img1, img2, imgDiff); 
00158 imgDiff.Scale(1.0 / maxCmpt);
00159 
00160 offImg->PutImage(imgDiff);
00161 window->HandleExpose();
00162 gs->Run();
00163 }
00164 
00165 return(0);
00166 }

Generated at Sat Aug 5 00:17:00 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /