stim-surprise.C

Go to the documentation of this file.
00001 /*!@file AppMedia/stim-surprise.C generate surprising stimuli */
00002 
00003 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/AppMedia/stim-surprise.C $
00004 // $Id: stim-surprise.C 9412 2008-03-10 23:10:15Z farhan $
00005 
00006 #include "Image/Image.H"
00007 #include "Image/DrawOps.H"
00008 #include "Image/ShapeOps.H"
00009 #include "Util/MathFunctions.H"
00010 #include "Image/Pixels.H"
00011 #include "Raster/Raster.H"
00012 
00013 #include <vector>
00014 
00015 #define WIDTH 256
00016 #define NFRAME 300
00017 #define DX 32
00018 #define DTHETA 0.1
00019 #define RAD 8
00020 
00021 int main(const int argc, const char **argv)
00022 {
00023   initRandomNumbers();
00024   Image<byte> img(WIDTH, WIDTH, NO_INIT);
00025 
00026   if (argc < 2) LFATAL("USAGE: stim_surprise <type>");
00027 
00028   // arrays of precessing dots and one is special in there?
00029   if (strcmp(argv[1], "dots") == 0)
00030     {
00031       // get random centers:
00032       std::vector<Point2D<int> > center; std::vector<double> phi;
00033       for (int j = DX/2; j < WIDTH; j += DX)
00034         for (int i = DX/2; i < WIDTH; i += DX)
00035           {
00036             center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00037                                      j + int(5.0 * (randomDouble()-0.5))));
00038             phi.push_back(M_PI * randomDouble());
00039           }
00040 
00041       double theta = 0.0, thetac = 0.0;;
00042       for (int k = 0; k < NFRAME; k ++)
00043         {
00044           img.clear();
00045 
00046           for (unsigned int n = 0; n < center.size(); n ++)
00047             {
00048               double t = theta, rx = RAD, ry = RAD, p = phi[n];
00049               byte col = 255;
00050               if (n == 27) t = thetac;
00051               //if (n == 27) { rx = 0; ry = 0; if ((k/6) & 1) col = 0; }
00052 
00053               int ii = int(center[n].i + rx * cos(t + p));
00054               int jj = int(center[n].j + ry * sin(t + p));
00055               drawDisk(img, Point2D<int>(ii, jj), 4, col);
00056             }
00057 
00058           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00059           theta += DTHETA; //thetac -= DTHETA; // += 3.67 * DTHETA;
00060         }
00061     }
00062   // random noise?
00063   else if (strcmp(argv[1], "rnd") == 0)
00064     {
00065       for (int k = 0; k < NFRAME; k ++)
00066         {
00067           for (int j = 0; j < WIDTH; j ++)
00068             for (int i = 0; i < WIDTH; i ++)
00069               {
00070 
00071                 double d2 = (i-127)*(i-127) + (j-127)*(j-127);
00072                 double coeff = exp(-d2 / 400.0) * 0.5;
00073 
00074                 img.setVal(i, j, 128 + int(256.0 * (1.0-coeff) * randomDouble()) -
00075                            int(128.0 * (1.0-coeff)));
00076               }
00077           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00078         }
00079     }
00080   // random blinking?
00081   else if (strcmp(argv[1], "blink") == 0)
00082     {
00083       // get random centers:
00084       std::vector<Point2D<int> > center; std::vector<int> phi;
00085       const int period = 20;
00086       for (int j = DX/2; j < WIDTH; j += DX)
00087         for (int i = DX/2; i < WIDTH; i += DX)
00088           {
00089             center.push_back(Point2D<int>(i + int(5.0 * (randomDouble()-0.5)),
00090                                      j + int(5.0 * (randomDouble()-0.5))));
00091             phi.push_back(randomUpToNotIncluding(period));
00092           }
00093 
00094       for (int k = 0; k < NFRAME; k ++)
00095         {
00096           img.clear();
00097 
00098           for (unsigned int n = 0; n < center.size(); n ++)
00099             {
00100               byte col;
00101               if (n == 27)
00102                 {
00103                   if (((k + phi[n]) & 4) < 2) col = 255; else col = 0;
00104                 }
00105               else
00106                 {
00107                   if (((k + phi[n]) % period) < period/2) col = 255;
00108                   else col = 0;
00109                 }
00110               drawDisk(img, center[n], 4, col);
00111             }
00112 
00113           Raster::WriteRGB(img, sformat("frame%06d.ppm", k));
00114 
00115         }
00116     }
00117   return 0;
00118 }
00119 
00120 // ######################################################################
00121 /* So things look consistent in everyone's emacs... */
00122 /* Local Variables: */
00123 /* indent-tabs-mode: nil */
00124 /* End: */
Generated on Sun May 8 08:40:08 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3