Page principale | Hiérarchie des classes | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier

Filter.cpp

Aller à la documentation de ce fichier.
00001 /// \file 00002 /// Implémentation des classes filtres 00003 #include "Filter.hpp" 00004 /////////////////////////////////////////////////////////////////////////////// 00005 /// Classe : Filter_Base 00006 /////////////////////////////////////////////////////////////////////////////// 00007 Filter_Base::Filter_Base(int _size):size(_size){} 00008 float Filter_Base::getMask(int col, int row){ 00009 return mask[row * size + col]; 00010 } 00011 void Filter_Base::setMask(int col, int row, float value){ 00012 mask[row * size + col] = value; 00013 } 00014 /// . 00015 /// Sommation des valeurs du filtres et division de chaque coefficients 00016 /// par cette somme. 00017 void Filter_Base::normalise() { 00018 float sum = 0.0; 00019 for (int j = 0; j < size; j++){ 00020 for (int i = 0; i < size; i++) { 00021 sum += getMask(i, j); 00022 } 00023 } 00024 if (sum != 0) { 00025 for (int j = 0; j < size; j++){ 00026 for (int i = 0; i < size; i++) { 00027 setMask(i, j, getMask(i, j) / sum); 00028 } 00029 } 00030 } 00031 } 00032 /// . 00033 /// Applique le filtre en chaque pointe de l'image source. 00034 PNG Filter_Base::apply(PNG src){ 00035 Trace trace("apply", channelFilter); 00036 PNG ret(src.getWidth(), src.getHeight(), src.getType(), ""); 00037 // Dimension de l'image 00038 int h = src.getHeight(); 00039 int w = src.getWidth(); 00040 int offset = size / 2; 00041 float r, g, b, gray; 00042 // Parcourt de l'image 00043 for(int vy = 0; vy < h; vy++){ 00044 for(int vx = 0; vx < w; vx++){ 00045 r = g = b = gray = 0; 00046 // Parcourt du filtre 00047 for(int i = 0; i < size; i++){ 00048 for(int j = 0; j < size; j++){ 00049 Color c = src.getColor(vx + j - offset, vy + i - offset); 00050 if(COLOR_GRAY == c.getType()){ 00051 gray += c.getGray() * getMask(j, i); 00052 } else if(COLOR_COLOR == c.getType()){ 00053 float f = getMask(j, i); 00054 r += c.getRed() * f; 00055 g += c.getGreen() * f; 00056 b += c.getBlue() * f; 00057 } 00058 } 00059 } 00060 // Résultat dans l'image destination 00061 if(PNG_GRAY == src.getType()){ 00062 ret.setColor(vx, vy, gray); 00063 } else if(PNG_COLOR == src.getType()){ 00064 Color result = Color(r, g, b, true); 00065 ret.setColor(vx, vy, result); 00066 } 00067 } 00068 } 00069 return ret; 00070 } 00071 /////////////////////////////////////////////////////////////////////////////// 00072 /// Classe : Filter_Base 00073 /////////////////////////////////////////////////////////////////////////////// 00074 00075 /// . 00076 /// Initialise les données membres et calcule du filtre 00077 Filter_Gaussian::Filter_Gaussian(int size, float _mu, float _sigma):Filter_Base(size){ 00078 sigma = _sigma; 00079 mu = _mu; 00080 mask = new float[size * size]; 00081 computeMask(); 00082 normalise(); 00083 } 00084 /// . 00085 /// Calcul du filtre gaussien 00086 void Filter_Gaussian::computeMask(){ 00087 Trace trace("_computeMask", channelFilter); 00088 float xCenter = (size - 1) / 2.0; 00089 float yCenter = (size - 1) / 2.0; 00090 00091 for(int j = 0; j < size; j++){ 00092 for(int i = 0; i < size; i++){ 00093 float value = exp(-(((double) i - xCenter - mu) * ((double) i - xCenter - mu) + ((double) j - yCenter - mu) * ((double) j - yCenter - mu)) / (2 * sigma * sigma)); 00094 setMask(i, j, value); 00095 } 00096 } 00097 } 00098 string Filter_Gaussian::toString(){ 00099 Trace trace("toString", channelFilter); 00100 std::ostringstream o; 00101 o << "mu " << mu << " sigma " << sigma << "\n"; 00102 for(int i = 0; i < size; i++){ 00103 for(int j = 0; j < size; j++){ 00104 o << "[" << i << ":" << j << "]" << getMask(i, j) << "\t"; 00105 } 00106 o << "\n"; 00107 } 00108 o << "\n\n"; 00109 return o.str(); 00110 } 00111 00112

Généré le Sun Jun 27 15:59:32 2004 pour segment par doxygen 1.3.7