Sim-LIT  2.0
 All Classes Namespaces Files Functions Variables Typedefs
RebuilderAverageOptimized.h
Go to the documentation of this file.
1 
11 #ifndef CLASS_REBUILDERAVERAGEOPTIMIZED
12 #define CLASS_REBUILDERAVERAGEOPTIMIZED
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 
30 
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 neighbors=8;
43  int w = img->getWidth()/img->getWidthBlock();
44  int h = img->getHeight()/img->getHeightBlock();
45  do{
46  for(int i = 0; i < h; i++){
47  for(int j = 0; j < w; j++){
48  if((!matrix[i][j].isValid()) && amountNeighbors(img,i,j)>=neighbors) // si el bloque no es válido
49  {
50  vector<int> add(amount_channels);
51  for(int x=0;x<amount_channels;x++)
52  add[x]=0;
53  count = 0;
54  /* cálculo del promedio de los canales de los vecinos */
55  for(int iBlock = max((int)i-1,0); iBlock <= min(i+1,h-1) ; iBlock++)
56  for(int jBlock = max((int)j-1,0); jBlock <= min(j+1,w-1); jBlock++)
57  if((i != iBlock) || (j != jBlock))
58  if(matrix[iBlock][jBlock].isValid()) // si el bloque vecino existe
59  {
60  vector<Pixel> *e = (vector<Pixel>*)matrix[iBlock][jBlock].getExtras();
61  for(int r=0;r<img->getHeightBlock();r++){
62  for(int c=0;c<img->getWidthBlock();c++){
63  vector<int> chnls = e->at((r*img->getWidthBlock())+c).getChannels();
64  for(int x=0;x<amount_channels;x++){
65  add[x]+=chnls[x];
66  }
67  count++;
68  }
69  }
70  }
71  if(count!=0)
72  {
73  for(int x=0;x<amount_channels;x++){
74  add[x]=(int)(add[x]/count);
75  //cout << add[x] << "---";
76  }
77  //cout << i << "-" << j << "\n";
78  DataBlock* px = new DataBlock(amount_channels,add,img->getWidthBlock(),img->getHeightBlock());
79  matrix[i][j]= *px;
80  }
81  }
82  }
83  }
84  neighbors-=1;
85  }while(neighbors>=0 && isLossBlock(img));
86  if(show_data)
87  cout << "The Image has been restored\n";
88  }
89 
90 private:
91 
92  int amountNeighbors(Images* img, int i, int j){
100  int w = img->getWidth()/img->getWidthBlock();
101  int h = img->getHeight()/img->getHeightBlock();
102  DataBlock** matrix=img->getMatrix();
103  int neighbors=0;
104  for(int iBlock = max((int)i-1,0); iBlock <= min(i+1,h-1) ; iBlock++)
105  for(int jBlock = max((int)j-1,0); jBlock <= min(j+1,w-1); jBlock++)
106  if((i != iBlock) || (j != jBlock))
107  if(matrix[iBlock][jBlock].isValid()) // si el bloque vecino existe
108  {
109  neighbors++;
110  }
111  //cout << "(" << i << "," << j << "):" << neighbors << "--\n";
112  return neighbors;
113  }
114 
115  bool isLossBlock(Images* img){
122  DataBlock** matrix = img->getMatrix();
123  int w=img->getWidth()/img->getWidthBlock();
124  int h=img->getHeight()/img->getHeightBlock();
125  for (int i = 0; i < h; ++i)
126  {
127  for (int j = 0; j < w; ++j)
128  {
129  if(!matrix[i][j].isValid())
130  return true;
131  }
132  }
133  return false;
134  }
135 
136 };
137 #endif
Clase que representa un Bloque de Píxeles.
Definition: DataBlock.h:19
virtual void hidden(Images *img, bool show_data)
Clase que implementa un método de ocultamiento de errores utilizando el promedio de sus vecinos más c...
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