00001
00016 #include "vetFilterNoiseChannel.h"
00017
00018 #include <time.h>
00019 #include <stdlib.h>
00020
00021
00026 vetFilterNoiseChannel::vetFilterNoiseChannel(vetFilterNoiseChannelParameters* initParams) : vetFilter()
00027 {
00028 INFO("vetFilterNoiseChannel::vetFilterNoiseChannel(..* initParams) : vetFilter() [CONTRUCTOR]")
00029
00030 zeroRGB[0] = 0;
00031 zeroRGB[1] = 0;
00032 zeroRGB[2] = 0;
00033
00034 oneRGB[0] = 1;
00035 oneRGB[1] = 1;
00036 oneRGB[2] = 1;
00037
00038 zeroChar = '0';
00039 oneChar = '1';
00040
00041 setParameters(initParams);
00042 reset();
00043
00044 setName("Noise Channel Simulator Filter");
00045 setDescription("Additive noise or others..");
00046 setVersion(1.0);
00047
00048 }
00049
00053 vetFilterNoiseChannel::~vetFilterNoiseChannel()
00054 {
00055 INFO("vetFilterNoiseChannel::~vetFilterNoiseChannel() [DESTRUCTOR]")
00056
00057 if (myParams != NULL)
00058 delete myParams;
00059 myParams = NULL;
00060
00061 }
00062
00072 VETRESULT vetFilterNoiseChannel::setParameters (vetFilterNoiseChannelParameters* initParams)
00073 {
00074 if ( initParams == NULL )
00075 myParams = new vetFilterNoiseChannelParameters();
00076 else
00077 myParams = initParams;
00078
00079 allocateBuffer(myParams->currentBuffer);
00080
00081 return VETRET_OK;
00082 }
00083
00089 VETRESULT vetFilterNoiseChannel::reset()
00090 {
00091 INFO("VETRESULT vetFilterNoiseChannel::reset() [SET DEFAULT PARAMETERS]")
00092
00093 releaseBuffers();
00094
00095 if (myParams != NULL)
00096 {
00097 myParams->reset();
00098 allocateBuffer(myParams->currentBuffer);
00099 }
00100 else
00101 setParameters(NULL);
00102
00103 resetNoiseSource();
00104 externalSource = NULL;
00105
00106 return VETRET_OK;
00107 }
00108
00109
00110
00111 void vetFilterNoiseChannel::generateNoise(vetFrameYUV420& img, unsigned char zero)
00112 {
00113 unsigned int size = img.getBufferSize();
00114 unsigned int perc = (unsigned int)( (float)size * myParams->spread);
00115 int noiseco = 0;
00116 int norm = myParams->normalize_value;
00117
00118 for ( unsigned int i = 0; i < size; i++ )
00119 img.data[i] = zero;
00120
00121 if ( myParams->normalized )
00122 {
00123 for ( unsigned int i = 0; i < perc; i++ )
00124 {
00125 img.data[ noiseco = rand()*rand() % size ] = rand() % norm;
00126 }
00127 }
00128 else
00129 {
00130 for ( unsigned int i = 0; i < perc; i++ )
00131 {
00132 img.data[ rand()*rand() % size ] = (unsigned char)rand();
00133 }
00134 }
00135 }
00136
00137 void vetFilterNoiseChannel::generateNoise(vetFrameRGB24& img, PixelRGB24 zero)
00138 {
00139 unsigned int size = img.getBufferSize();
00140 unsigned int perc = (unsigned int)( (float)size * myParams->spread);
00141 unsigned int noiseco = 0;
00142 int norm = myParams->normalize_value;
00143
00144 for ( unsigned int i = 0; i < size; i++ )
00145 img.data[i] = zero;
00146
00147 if ( myParams->normalized )
00148 {
00149 for ( unsigned int i = 0; i < perc; i++ )
00150 {
00151 noiseco = rand()*rand() % size;
00152 img.data[noiseco][0] = (unsigned char)( rand() % norm);
00153 noiseco = rand()*rand() % size;
00154 img.data[noiseco][1] = (unsigned char)( rand() % norm);
00155 noiseco = rand()*rand() % size;
00156 img.data[noiseco][2] = (unsigned char)( rand() % norm);
00157 }
00158 }
00159 else
00160 {
00161 for ( unsigned int i = 0; i < perc; i++ )
00162 {
00163 noiseco = rand()*rand() % size;
00164 img.data[noiseco][0] = (unsigned char)rand();
00165 noiseco = rand()*rand() % size;
00166 img.data[noiseco][1] = (unsigned char)rand();
00167 noiseco = rand()*rand() % size;
00168 img.data[noiseco][2] = (unsigned char)rand();
00169 }
00170 }
00171 }
00172
00173 void vetFilterNoiseChannel::generateNoise(vetFrameT<unsigned char>& img, unsigned char zero)
00174 {
00175 unsigned int size = img.getBufferSize();
00176 unsigned int perc = (unsigned int)( (float)size * myParams->spread);
00177 int noiseco = 0;
00178 int norm = myParams->normalize_value;
00179
00180 for ( unsigned int i = 0; i < size; i++ )
00181 img.data[i] = zero;
00182
00183 if ( myParams->normalized )
00184 {
00185 for ( unsigned int i = 0; i < perc; i++ )
00186 {
00187 img.data[ noiseco = rand()*rand() % size ] = rand() % norm;
00188 }
00189 }
00190 else
00191 {
00192 for ( unsigned int i = 0; i < perc; i++ )
00193 {
00194 img.data[ rand()*rand() % size ] = rand();
00195 }
00196 }
00197 }
00198
00199
00200 VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameYUV420& img)
00201 {
00202 INFO("VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameYUV420& img)")
00203
00204 if ( !isBufferYUV() )
00205 {
00206 useBufferYUV(img.width, img.height);
00207
00208 }
00209
00210 if ( externalSource == NULL )
00211 generateNoise(*bufferYUV, zeroChar);
00212 else
00213 *externalSource >> *bufferYUV;
00214
00215 *bufferYUV += img;
00216
00217 return VETRET_OK;
00218 }
00219
00220
00221 VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameRGB24& img)
00222 {
00223 INFO("VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameRGB24& img)")
00224
00225 if ( !isBufferRGB() )
00226 {
00227 useBufferRGB(img.width, img.height);
00228
00229 }
00230
00231 if ( externalSource == NULL )
00232 generateNoise(*bufferRGB, zeroRGB);
00233 else
00234 *externalSource >> *bufferRGB;
00235
00236 *bufferRGB += img;
00237
00238 return VETRET_OK;
00239 }
00240
00241
00242 VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameT<unsigned char>& img)
00243 {
00244 INFO("VETRESULT vetFilterNoiseChannel::AddNoise(vetFrameT<unsigned char>& img)")
00245
00246 if ( !isBufferTuC() )
00247 {
00248 useBufferTuC(img.width, img.height, img.profile);
00249
00250 }
00251
00252 if ( externalSource == NULL )
00253 generateNoise(*bufferTuC, zeroChar);
00254 else
00255 *externalSource >> *bufferTuC;
00256
00257 *bufferTuC += img;
00258
00259 return VETRET_OK;
00260 }
00261
00262 VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameYUV420& img)
00263 {
00264 INFO("VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameYUV420& img)")
00265
00266 if ( !isBufferYUV() )
00267 {
00268 useBufferYUV(img.width, img.height);
00269
00270 }
00271
00272 if ( externalSource == NULL )
00273 generateNoise(*bufferYUV, oneChar);
00274 else
00275 *externalSource >> *bufferYUV;
00276
00277 *bufferYUV *= img;
00278
00279 return VETRET_OK;
00280 }
00281
00282
00283 VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameRGB24& img)
00284 {
00285 INFO("VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameRGB24& img)")
00286
00287 if ( !isBufferRGB() )
00288 {
00289 useBufferRGB(img.width, img.height);
00290
00291 }
00292
00293 if ( externalSource == NULL )
00294 generateNoise(*bufferRGB, oneRGB);
00295 else
00296 *externalSource >> *bufferRGB;
00297
00298
00299
00300
00301 return VETRET_OK;
00302 }
00303
00304 VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameT<unsigned char>& img)
00305 {
00306 INFO("VETRESULT vetFilterNoiseChannel::MultiplyNoise(vetFrameT<unsigned char>& img)")
00307
00308 if ( !isBufferTuC() )
00309 {
00310 useBufferTuC(img.width, img.height, img.profile);
00311
00312 }
00313
00314 if ( externalSource == NULL )
00315 generateNoise(*bufferTuC, oneChar);
00316 else
00317 *externalSource >> *bufferTuC;
00318
00319
00320
00321
00322 return VETRET_OK;
00323 }
00324
00325
00326
00327 void vetFilterNoiseChannel::resetNoiseSource()
00328 {
00329 INFO("void vetFilterNoiseChannel::resetNoiseSource()")
00330
00331
00332 time_t t;
00333 srand((unsigned) time(&t));
00334
00335 }
00336
00337 VETRESULT vetFilterNoiseChannel::setNoiseSource(vetInput& frameSource)
00338 {
00339 DEBUGMSG("VETRESULT vetFilterNoiseChannel::setNoiseSource(vetInput& frameSource)", &frameSource)
00340
00341 externalSource = &frameSource;
00342
00343 return VETRET_OK;
00344 }
00345
00346
00347
00348
00349
00350
00361 VETRESULT vetFilterNoiseChannel::importFrom(vetFrameYUV420& img)
00362 {
00363 INFO("VETRESULT vetFilterNoiseChannel::importFrom(vetFrameYUV420& img) [reading data]")
00364
00365 if ( myParams->operation == vetFilterNoiseChannelParameters::ADDITIVE )
00366 AddNoise(img);
00367 else if ( myParams->operation == vetFilterNoiseChannelParameters::MULTIPLICATIVE )
00368 MultiplyNoise(img);
00369
00370 return VETRET_OK;
00371 }
00372
00383 VETRESULT vetFilterNoiseChannel::importFrom(vetFrameRGB24& img)
00384 {
00385 INFO("VETRESULT vetFilterNoiseChannel::importFrom(vetFrameYUV420& img) [reading data]")
00386
00387 if ( myParams->operation == vetFilterNoiseChannelParameters::ADDITIVE )
00388 AddNoise(img);
00389 else if ( myParams->operation == vetFilterNoiseChannelParameters::MULTIPLICATIVE )
00390 MultiplyNoise(img);
00391
00392 return VETRET_OK;
00393 }
00394
00405 VETRESULT vetFilterNoiseChannel::importFrom(vetFrameT<unsigned char>& img)
00406 {
00407 INFO("VETRESULT vetFilterNoiseChannel::importFrom(vetFrameT<unsigned char>& img) [reading data]")
00408
00409 if ( myParams->operation == vetFilterNoiseChannelParameters::ADDITIVE )
00410 AddNoise(img);
00411 else if ( myParams->operation == vetFilterNoiseChannelParameters::MULTIPLICATIVE )
00412 MultiplyNoise(img);
00413
00414 return VETRET_OK;
00415 }
00416
00417
00418
00419
00420
00421
00422
00423 vetFilterNoiseChannelParameters::vetFilterNoiseChannelParameters(NOISEOPER mode)
00424 {
00425 reset();
00426 operation = mode;
00427 }
00428
00429 void vetFilterNoiseChannelParameters::reset()
00430 {
00431 operation = vetFilterNoiseChannelParameters::ADDITIVE;
00432 normalized = false;
00433 normalize_value = 255;
00434 spread = 1.;
00435 currentBuffer = vetFilterParameters::NONE;
00436 }
00437
00438
00439
00440 int vetFilterNoiseChannelParameters::saveToStreamXML(FILE *fp)
00441 {
00442
00443 if ( fp == NULL )
00444 return VETRET_PARAM_ERR;
00445
00446 if( fprintf(fp, "<vetFilterNoiseChannelParameters>\n") == EOF )
00447 return VETRET_INTERNAL_ERR;
00448
00449 if ( fprintf(fp, " <operation value=\"%i\" />\n", (int)operation) == EOF)
00450 return VETRET_INTERNAL_ERR;
00451
00452 if ( fprintf(fp, " <spread value=\"%f\" />\n", spread) == EOF)
00453 return VETRET_INTERNAL_ERR;
00454
00455 if ( fprintf(fp, " <normalized enabled=\"%u\" value=\"%u\" />\n", (int)normalized, normalize_value) == EOF)
00456 return VETRET_INTERNAL_ERR;
00457
00458 if ( fprintf(fp, " <internalBufferType value=\"%u\" />\n", (int)currentBuffer) == EOF)
00459 return VETRET_INTERNAL_ERR;
00460
00461 if( fprintf(fp, "</vetFilterNoiseChannelParameters>\n") == EOF )
00462 return VETRET_INTERNAL_ERR;
00463
00464 return VETRET_OK;
00465 }
00466
00467
00468
00469 int vetFilterNoiseChannelParameters::loadFromStreamXML(FILE *fp)
00470 {
00471 if ( fscanf(fp, "<vetFilterNoiseChannelParameters>\n") == EOF )
00472 throw "error in XML file, unable to import data.";
00473
00474 int runTmp = 0;
00475 if ( fscanf(fp, " <operation value=\"%i\" />\n", &runTmp) == EOF )
00476 throw "error in XML file, unable to import data.";
00477 else
00478 operation = (NOISEOPER)runTmp;
00479
00480 if ( fscanf(fp, " <spread value=\"%f\" />\n", &spread) == EOF )
00481 throw "error in XML file, unable to import data.";
00482
00483 int boolTmp = 0;
00484 if ( fscanf(fp, " <normalized enabled=\"%u\" value=\"%u\" />\n", &boolTmp, &normalize_value) == EOF )
00485 throw "error in XML file, unable to import data.";
00486
00487 if (boolTmp == 0)
00488 normalized = false;
00489 else
00490 normalized = true;
00491
00492 int cB = (int)currentBuffer;
00493 if ( fscanf(fp, " <internalBufferType value=\"%u\" />\n", &cB) == EOF )
00494 throw "error in XML file, unable to import data.";
00495
00496 return VETRET_OK;
00497 }
00498