Sim-LIT  2.0
 All Classes Namespaces Files Functions Variables Typedefs
RebuilderAverage.h
Go to the documentation of this file.
1 
11 #ifndef CLASS_REBUILDERAVERAGE
12 #define CLASS_REBUILDERAVERAGE
13 
14 #define max(a, b) ((a) > (b) ? (a) : (b))
15 #define min(a, b) ((a) < (b) ? (a) : (b))
16 
17 #include "Rebuilder.h"
18 #include "Images.h"
19 #include "DataBlock.h"
20 #include <iostream>
21 #include <vector>
22 
23 using namespace std;
24 
26 
27 public:
28 
29  RebuilderAverage(){};
30 
31  ~RebuilderAverage(){};
32 
33  virtual void hidden(Images* img, bool show_data){
39  DataBlock** matrix = img->getMatrix();
40  int amount_channels = img->getType();
41  int count;
42  int w = img->getWidth()/img->getWidthBlock();
43  int h = img->getHeight()/img->getHeightBlock();
44  do{
45  for(int i = 0; i < h; i=i+1)
46  {
47  for(int j = 0; j < w; j=j+1)
48  {
49  if(!matrix[i][j].isValid()) // si el píxel no es válido
50  {
51  vector<int> add(amount_channels);
52  for(int x=0;x<amount_channels;x++)
53  add[x]=0;
54  count = 0;
55  // cálculo del promedio de los canales de los vecinos */
56  for(int iBlock = max((int)i-1,0); iBlock <= min(i+1,h-1) ; iBlock++)
57  for(int jBlock = max((int)j-1,0); jBlock <= min(j+1,w-1); jBlock++)
58  if((i != iBlock) || (j != jBlock))
59  if(matrix[iBlock][jBlock].isValid()) // si el bloque vecino existe
60  {
61  vector<Pixel> *e = (vector<Pixel>*)matrix[iBlock][jBlock].getExtras();
62  for(int r=0;r<img->getHeightBlock();r++){
63  for(int c=0;c<img->getWidthBlock();c++){
64  vector<int> chnls = e->at(r*(img->getWidthBlock())+c).getChannels();
65  for(int x=0;x<amount_channels;x++){
66  add[x]+=chnls[x];
67  }
68  count=count+1;
69  }
70  }
71  }
72 
73  if(count!=0)
74  {
75  for(int x=0;x<amount_channels;x=x+1){
76  add[x]=(int)(add[x]/count);
77  }
78  DataBlock* db = new DataBlock(amount_channels,add,img->getWidthBlock(),img->getHeightBlock());
79  matrix[i][j]= *db;
80  }
81  }
82  }
83  }
84  }while(isLossBlock(img));
85  if(show_data)
86  cout << "The Image has been restored\n";
87  }
88 
89 private:
90 
91  bool isLossBlock(Images* img){
98  DataBlock** matrix = img->getMatrix();
99  int w=img->getWidth()/img->getWidthBlock();
100  int h=img->getHeight()/img->getHeightBlock();
101  for (int i = 0; i < h; ++i)
102  {
103  for (int j = 0; j < w; ++j)
104  {
105  if(!matrix[i][j].isValid())
106  return true;
107  }
108  }
109  return false;
110  }
111 
112 };
113 #endif
Clase que representa un Bloque de Píxeles.
Definition: DataBlock.h:19
Clase que implementa un método de ocultamiento de errores utilizando el promedio de sus vecinos más c...
virtual void hidden(Images *img, bool show_data)
Clase que representa una Imagen.
Definition: Images.h:22
Clase Abstracta que indica la forma que debe tener todo método de Ocultamiento de errores en Imágenes...
Definition: Rebuilder.h:15