* green/mln/display/display_histo.hh: Fix bug in the direction.
* green/mln/display/project_histo.hh: Add spaces to follow the LRDE
norm.
---
milena/sandbox/ChangeLog | 8 ++++++++
milena/sandbox/green/mln/display/display_histo.hh | 13 +++++++++----
milena/sandbox/green/mln/display/project_histo.hh | 4 ++--
3 files changed, 19 insertions(+), 6 deletions(-)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 1ea3546..b94de66 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -75,6 +75,14 @@
* bin/pgm_to_pbm.cc,
* bin/ppm_negate.cc: New.
+2009-12-17 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Fix bug in the direction of projection.
+
+ * green/mln/display/display_histo.hh: Fix bug in the direction.
+ * green/mln/display/project_histo.hh: Add spaces to follow the LRDE
+ norm.
+
2009-12-16 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Fix bugs in regional_maxima routine, work with rgb8 for stats.
diff --git a/milena/sandbox/green/mln/display/display_histo.hh b/milena/sandbox/green/mln/display/display_histo.hh
index d34914c..1fd5da4 100644
--- a/milena/sandbox/green/mln/display/display_histo.hh
+++ b/milena/sandbox/green/mln/display/display_histo.hh
@@ -28,10 +28,12 @@
#ifndef MLN_DISPLAY_DISPLAY_HISTO_HH
# define MLN_DISPLAY_DISPLAY_HISTO_HH
+# include <mln/accu/math/sum.hh>
# include <mln/data/stretch.hh>
-# include <mln/fun/v2v/log.hh>
# include <mln/display/project_histo.hh>
-# include <mln/accu/math/sum.hh>
+# include <mln/fun/v2v/log.hh>
+# include <mln/value/int_u8.hh>
+
/// \file
///
@@ -59,9 +61,12 @@ namespace mln
///
/// The 3d histogram is projected in red/green space by
/// accumulating around the the blue dimension (green and blue
- /// composantes are being correlated). In fact, we sum in along
+ /// composantes are being correlated). In fact, we sum along
/// the blue direction. Then, we stretch value to feet pgm
/// format.
+ /// Direction r = 1
+ /// Direction g = 2
+ /// Direction b = 0
///
/// \parameter[in] histo the histogram in 3d.
/// \result return a equivalent 2d image.
@@ -74,7 +79,7 @@ namespace mln
typedef value::int_u8 t_int_u8;
typedef fun::v2v::log<float> t_log;
- image2d<unsigned> proj = project_histo<t_sum,2>(histo);
+ image2d<unsigned> proj = project_histo<t_sum,0>(histo);
image2d<t_int_u8> proj_int = data::stretch(t_int_u8(),
data::transform(proj,
t_log()));
diff --git a/milena/sandbox/green/mln/display/project_histo.hh b/milena/sandbox/green/mln/display/project_histo.hh
index 63ea84e..f0e6858 100644
--- a/milena/sandbox/green/mln/display/project_histo.hh
+++ b/milena/sandbox/green/mln/display/project_histo.hh
@@ -54,7 +54,7 @@ namespace mln
image2d<mln_result(A)>
project_histo(const image3d<V>& histo);
-#ifndef MLN_INCLUDE_ONLY
+# ifndef MLN_INCLUDE_ONLY
/// \brief Allow the visualization of 3d histogram.
///
@@ -86,7 +86,7 @@ namespace mln
return accu::image::to_result(histo_accu);
}
-#endif // ! MLN_INCLUDE_ONLY
+# endif // ! MLN_INCLUDE_ONLY
} // end of namespace mln::transform
--
1.5.6.5
* green/doc/annotating: New directory.
* green/doc/annotating/class.txt: New hierarchy description.
* green/doc/annotating/testMillet2008.txt: New result interpretations.
* green/doc/annotating/syntheseMillet2008.txt: New feature extractions.
* green/demo/annotating/class.txt: Remove this obsolete file.
---
milena/sandbox/ChangeLog | 10 +
milena/sandbox/green/demo/annotating/class.txt | 33 ---
milena/sandbox/green/doc/annotating/class.txt | 42 +++
.../green/doc/annotating/syntheseMillet2008.txt | 283 ++++++++++++++++++++
milena/sandbox/green/doc/annotating/testMillet2008 | 69 +++++
5 files changed, 404 insertions(+), 33 deletions(-)
delete mode 100644 milena/sandbox/green/demo/annotating/class.txt
create mode 100644 milena/sandbox/green/doc/annotating/class.txt
create mode 100644 milena/sandbox/green/doc/annotating/syntheseMillet2008.txt
create mode 100644 milena/sandbox/green/doc/annotating/testMillet2008
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index 6435445..a096559 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -75,6 +75,16 @@
* bin/pgm_to_pbm.cc,
* bin/ppm_negate.cc: New.
+2009-12-16 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
+
+ Group Millet2008 documentation files.
+
+ * green/doc/annotating: New directory.
+ * green/doc/annotating/class.txt: New hierarchy description.
+ * green/doc/annotating/testMillet2008.txt: New result interpretations.
+ * green/doc/annotating/syntheseMillet2008.txt: New feature extractions.
+ * green/demo/annotating/class.txt: Remove this obsolete file.
+
2009-12-16 Yann Jacquelet <jacquelet(a)lrde.epita.fr>
Correct typo into directories.
diff --git a/milena/sandbox/green/demo/annotating/class.txt b/milena/sandbox/green/demo/annotating/class.txt
deleted file mode 100644
index ec7e92e..0000000
--- a/milena/sandbox/green/demo/annotating/class.txt
+++ /dev/null
@@ -1,33 +0,0 @@
-Dans scribo les classes de documents sont:
-
-- image seule (photo)
-- courrier manuscrit
-- courrier dactylographié
-- facture ou feuille organisée sous forme de tableau
-- article de journal
-- document composite
-- infographie (logo, carte, dessin vectoriel)
-- slide (copie d'écran ou sauvegarde au format image)
-
-
-Où se situent les faxes ?
-
-
-Description d'un fax:
-- ratio l/L assimilable à du A4 ou US Letter
-- nombre de couleurs très petit, < 1000
-- plutôt du N & B, mais quelques faxes sont en couleurs
-- généralement un % élevé de blanc (la page vierge)
-
-
-Description d'un article de journal:
-- nombre élevés de couleurs (> 10 000) en général
-- quelques articles de conférences autour de 5000
-
-
-Description des photos:
-- un nombre très élevé de couleurs
-- ratio non A4, non US Letter
-
-
-
diff --git a/milena/sandbox/green/doc/annotating/class.txt b/milena/sandbox/green/doc/annotating/class.txt
new file mode 100644
index 0000000..0fa5cf9
--- /dev/null
+++ b/milena/sandbox/green/doc/annotating/class.txt
@@ -0,0 +1,42 @@
+Dans scribo les classes de documents sont:
+
+- image seule (photo)
+- courrier manuscrit
+- courrier dactylographié
+- facture ou feuille organisée sous forme de tableau
+- article de journal
+- document composite
+- infographie (logo, carte, dessin vectoriel)
+- slide (copie d'écran ou sauvegarde au format image)
+
+Le problème avec cette hiérarchie c'est quelle induit une connaissance
+fonctionnelle des images traitées et que les extracteurs de primitives font
+plutôt ressortir des informations relatives à la nature de l'image.
+
+Par exemple, les slides peuvent contenir aussi bien du texte, que des photos
+ou des cliparts. C'est une forme de "composite" par définition.
+
+Où se situent les faxes ?
+
+
+Description d'un fax:
+- ratio l/L assimilable à du A4 ou US Letter
+- nombre de couleurs très petit, < 1000
+- plutôt du N & B, mais quelques faxes sont en couleurs
+- généralement un % élevé de blanc (la page vierge)
+
+
+Description d'un article de journal:
+- nombre élevés de couleurs (> 10 000) en général
+- quelques articles de conférences autour de 5000
+
+
+Description des photos:
+- un nombre très élevé de couleurs
+- ratio non A4, non US Letter
+
+
+Google hiérarchie:
+- line drawing
+- clipart
+- photo
diff --git a/milena/sandbox/green/doc/annotating/syntheseMillet2008.txt b/milena/sandbox/green/doc/annotating/syntheseMillet2008.txt
new file mode 100644
index 0000000..b7b3648
--- /dev/null
+++ b/milena/sandbox/green/doc/annotating/syntheseMillet2008.txt
@@ -0,0 +1,283 @@
+
+Millet utilise un certain nombre de descripteurs (p 65, Chapitre 3)
+pour l'annotation automatique. Son objectif est de formuler une
+annotation automatique simple à partir de descripteurs de bas niveaux
+qui permettent de réaliser l'opération en moins de 10 secondes.
+
+L'auteur présente dans le chapitre 4, p 77 l'arbre de classification
+et l'utilisation précise qu'il fait de ces descripteurs.
+
+
+Reconnaissance des images de clipart versus photographies
+Reconnaissance des images Noir & Blanc versus Couleur
+Reconnaissance Interieur versus Exterieur
+Autre reconnaissance cartes, photos, peintures.
+
+
+ /---------Image------------\
+ | |
+ v v
+ /-------+------+-------\ /-------+----------\
+ | | | | | | |
+ v v | v v v v
+Carte Clipart | Peinture Couleur N&B N&B colorisé
+ |
+ v
+ /----Photo----------\
+ | |
+ v |
+ /----------\ |
+ | | |
+ v | v
+Intérieur | Visages
+ |
+ v
+ /-----Extérieur------\
+ | |
+ v v
+ /-----\ /-----\
+ | | | |
+ v v v v
+Jour Nuit Nature Urbain
+
+
+Note:
+-----
+Lorsque d'un concept, on part de sa droite et de sa gauche, il s'agit en fait
+de tests différents effectués en parallèles (ex.: Image, Photo, Extérieur).
+
+Lorsqu'on aboutit à une bifurcation et qu'il ne s'agit pas d'un concept, cela
+correspond à un seul test dont les résultats sont répartis dans des classes
+différentes.
+
+Fax
+Magazine
+
+
+
+ANNEXE 1 : SYNTHESE DESCRIPTEURS MILLET
+=======================================
+
+* RGB-64
+--------
+Chaque composante est quantifiée sur 4 valeurs (4x4x4 = 64), puis on construit
+l'histogramme à 64 composantes.
+
+
+* TSVal
+-------
+A partir de l'espace RGB d'origine, on effectue
+la transformation. Attention les composantes ne sont pas quantifiées
+de la même manière (18 valeurs pour la teinte [17 + 1 pour le
+négatif], Val et S sont quantifiées sur 3 valeurs
+chacunes. L'histogramme obtenu dans cet espace contiendra 162
+composantes.
+
+Val = max(R,G,B)
+S = [max(R,G,B) - min(R,G,B)] / max(R,G,B)
+
+Si R = max(R,G,B)
+Alors T = 60 * (G-B) / [max(R,G,B) - min(R,G,B)]
+
+Si G = max(R,G,B)
+Alors T = 60 * (2 + (B-R) / [max(R,G,B) - min(R,G,B)])
+
+Si B = max(R,G,B)
+Alors T = 60 * (4 + (R-G) / [max(R,G,B) - min(R,G,B)])
+
+
+* RGB-64-9
+----------
+L'image est décomposée en 9 sous images identiques, puis on applique le
+descripteur RGB-64. L'histogramme obtenu est la concaténation des 9
+histogrammes soit un histogramme résultant à 576 composantes.
+
+
+* BIC
+-----
+L'image est quantifiée en 216 couleurs (RGB-216) 6 valeurs par couleur. On
+distingue ensuite les pixels du bord des pixels intérieurs. Les pixels
+intérieurs ont la même couleur que leurs 4-voisins. Un histogramme est crée
+pour chaque groupe de pixels. Puis on concatène
+les histogrammes en un seul de 432 composantes.
+
+
+* LEP
+-----
+On construit une image de gradient avec un sobel 3x3, puis cette image est
+seuillée à 100 et devient donc binaire. On étiquette les configurations
+obtenues avec un masque 3x3 classique (convolution). Il existe 2^9
+configurations possibles. On construit alors un histogramme à 512 composantes.
+
+masque de convolution pour l'identification de la configuration:
+001 002 004
+008 256 016
+032 064 128
+
+
+* GABOR
+-------
+Très coûteux, la réponse de 24 filtres sur une image 300x300 est de l'ordre de
+ 1s. On utilise ici des filtres de taille 8x8.
+
+F(x,y) = [1 / (2 PI sigma_x sigma_y)]
+ * exp[(-1/2)(x^2/sigma_x^2 + y^2/sigma_y^2)] * exp[j2 PI Wx]
+
+sigma_x et sigma_y sont des paramètres d'échelles.
+W permet de changer l'orientation.
+
+Il existe une formule pour trouver les coefficients des filtres une fois que
+l'on a déterminé le nombre d'orientations et d'échelles utilisées. On ne
+retiendra, en sortie de filtre, que la variance et l'énergie. L'auteur
+préconise d'utiliser 6 directions et 4 échelles.
+
+
+--------------GABOR---------MATLAB----------------------------------------------
+function gb=gabor_fn(sigma,theta,lambda,psi,gamma)
+
+sigma_x = sigma;
+sigma_y = sigma/gamma;
+
+% Bounding box
+nstds = 3;
+xmax = max(abs(nstds*sigma_x*cos(theta)),abs(nstds*sigma_y*sin(theta)));
+xmax = ceil(max(1,xmax));
+ymax = max(abs(nstds*sigma_x*sin(theta)),abs(nstds*sigma_y*cos(theta)));
+ymax = ceil(max(1,ymax));
+xmin = -xmax; ymin = -ymax;
+[x,y] = meshgrid(xmin:xmax,ymin:ymax);
+
+% Rotation
+x_theta=x*cos(theta)+y*sin(theta);
+y_theta=-x*sin(theta)+y*cos(theta);
+
+gb=exp(-.5*(x_theta.^2/sigma_x^2+y_theta.^2/sigma_y^2)).*cos(2*pi/lambda*x_theta+psi);
+
+http://matlabserver.cs.rug.nl/cgi-bin/matweb.exe
+Gabor Filters. Tech. rep., 2002.
+--------------GABOR---------MATLAB----------------------------------------------
+
+
+* PROJECTION
+------------
+L'image est redimentionnée en 100x100. Un coup de Sobel 3x3, puis une
+binarisation avec s=100. On considère les moitiées verticales puis
+horizontales. Pour les moitiées verticales, on réalise la somme sur chacune
+des lignes, on obtient alors un vecteur de taille 100.
+Pour les moitiées horizontales, on réalise les sommes des colonnes. On obtient
+alors un vecteur taille 100. Les 4 sous vecteurs obtenus peuvent être
+concaténés pour former un unique descipteur de 400 composantes.
+
+
+
+ANNEXE 2 : SYNTHESE CLASSIFICATION MILLET
+=========================================
+
+
+* Reconnaissance des images de clipart versus photographies
+-----------------------------------------------------------
+
+Construire l'histogramme de l'image, éliminer toutes les couleurs peu
+représentées et ensuite les comptées. Moins de 50 couleurs / 256, c'est un
+clipart, plus de 150 / 256 c'est une photographie. Entre les deux, indécision.
+D'après l'auteur, le test n'est pas complètement fiable et peu être évincé, tout
+dépend de la qualité de la compression des cliparts.
+
+Diviser l'image en 16 imagettes (4x4), calculer la suite pour chaque imagette.
+Trouver le maxima de l'histogramme (noté p)/ p = argmax H(x), x in [0,255].
+Puis on calcule un sigma autour du pic.
+
+sigma^2 = Sum(p-1,p-5) r(x) pour p > 250
+sigma^2 = Sum(p+1,p+5) r(x) pour p < 005
+sigma^2 = (1/2) (Sum(p-1,p-5) r(x) + Sum(p+1,p+5) r(x)) pour les autres p
+
+r(x) = ((H(x)/H(p)) * (x-p))^2
+
+
+Le descripteur de l'image entière est alors le maximum des 16 sigma^2. Si le
+pic est resseré, c'est plutôt un clipart (< 5), sinon plutôt une photographie
+(> 40). Le seuil est fixé à 15.
+
+
+
+* Reconnaissance des images Noir & Blanc versus Couleur
+-------------------------------------------------------
+
+Achromatisme (en passant par TSVal)
+
+si |R - G| < s
+et si |R - B| < s alors R ~ G ~ B
+et si |G - B| < s
+
+==> T = -1
+==> Val = (R + G + B)/3
+
+L'auteur propose s = 0,03
+
+Une image est dite Noir & Blanc (donc Achromatique) si + de 99% des pixels le
+sont. Le test peut être appliqué aux images étiquetées comme des cliparts, ou
+des photographies.
+
+
+Faible saturation:
+
+On établit l'histogramme de la saturation de l'image (0 à 255). Si plus de 95%
+des pixels sont inférieurs à une saturation de 100, alors l'image est faiblement
+saturée. Ce test ne s'applique sur les photographies, surtout pas aux cliparts.
+
+
+Dominance de la teinte (image jaunie):
+
+On construit l'histogramme de la teinte (0 à 255). On localise le maximum de
+l'histogramme. Si + de 95% des pixels ont une distance < 20 du maximum, alors
+l'image est considérée comme Noir & Blanc et on peut donner sa teinte dominante.
+De plus il faut qu'au moins 50% des pixels soient faiblement saturés.
+
+T = -1 Achromatisme
+ 0 <= T < 14 Rouge
+ 14 <= T < 29 Orange
+ 29 <= T < 45 Jaune
+ 45 <= T < 113 Vert
+113 <= T < 149 Cyan
+149 <= T < 205 Bleu
+205 <= T < 235 Violet
+235 <= T < 242 Rose, Magenta
+242 <= T < 255 Rouge
+
+
+ 0 <= V < 82 Noir
+ 82 <= V < 179 Gris
+179 <= V < 255 Blanc
+
+
+Pour un pixel (S, Val)
+si |184 - S| + |65 - Val| < |255 - S| + |125 - Val| alors marron sinon orange.
+
+Et encore
+si la teinte est jaune et Val < 80 alors vert sinon jaune.
+
+
+
+* Reconnaissance Interieur versus Exterieur
+-------------------------------------------
+
+Utilisation des descripteurs LEP et RGB-64. Expérience avec un kpp ~ 80%. Puis
+expérimentation avec un SVM ~ 90% de réussite. Finalement, inclusion dans le SVM
+de LEP, RGB-64, TSVal-125, projection, Bic, Gabor.
+
+
+
+
+* Localisation des visages
+--------------------------
+
+Une semaine d'apprentissage, 5 secondes pour leur localisation. Je ne suis pas
+sûr que cette méthode soit pertinente pour notre contexte applicatif.
+
+
+
+* Autre classification
+----------------------
+
+Utilisation de SVM et de tous les descripteurs possibles comme pour Interieur
+versus Exterieur.
diff --git a/milena/sandbox/green/doc/annotating/testMillet2008 b/milena/sandbox/green/doc/annotating/testMillet2008
new file mode 100644
index 0000000..a5cf22d
--- /dev/null
+++ b/milena/sandbox/green/doc/annotating/testMillet2008
@@ -0,0 +1,69 @@
+Dans le cadre de nos recherches, nous testons le classifieur de
+Millet2008 pour la classification des images en clipart ou en
+photographies. Deux tests sont proposés, le premier est basé sur le
+nombre de couleurs de l'image après un seuillage de l'histogramme de
+façon à éliminer les couleurs de faible contribution; le second test
+consiste à extraire le pic de l'histogramme et à mesurer une
+"variance" normalisée autour de ce pic. Le premier test part du
+principe que les photographies possèdent de très nombreuses couleurs,
+tandis que les cliparts n'en ont que quelques unes. Le test n'est pas
+toujours vérifié. Le second test s'intéresse à la nature de
+l'histogramme. L'idée étant de montrer qu'un histogramme continu, donc
+avec une "variance" élevé autour du pic principal est plutôt
+représentatif des phtotographies, alors qu'une "variance" faible tient
+d'avantage du clipart (peu de couleurs, couleurs isolées). Selon
+l'auteur, ce second test donne de très bon résultats. Il peut être
+affiné en divisant l'image en 16 sous parties et en analysant chacune
+des imagettes avec la technique décrite ci-dessus. Dans ce cas, la
+"variance" de l'image est le max des "variances" des imagettes. Les
+repères suivnt sont donnés par l'auteur, "variance" < 5 pour les
+clipart et "variance" ~ 40 pour les photographies (seuil fixé à 15).
+
+
+Test A (Nombre de couleurs dans l'histogramme):
+-----------------------------------------------
+
+
+Test B ("Variance" autour du pic principal):
+--------------------------------------------
+
+bill: Les images de factures contiennent un ensemble d'informations
+groupés sous forme de tableau. Il peut y avoir plusieurs tableaux,
+visibles ou non. Pour la pupart des histogrammes observés,
+l'information en niveau de gris montre un grand pic blanc sans
+voisinage ou avec un voisinage de taille insignifiante. Toutes les
+factures devraient être classées comme des cliparts sauf exception.
+
+deux images sortent du lot:
+- bill17.ppm => 12.7828
+- bill23.ppm => 17.2565
+
+bill17 contient des dégradés qui viennent épaissir le pic blanc, du
+coup le voisinage autour du pic devient plus important.
+
+bill23 contient un logo et une image de fond en transparence sur le
+tableau. Par ailleurs, certains textes sont sur un fond
+composite. Tous ces éléments viennent épaissir le pic blanc.
+
+Résultat : 29 images / 30 passent le test
+
+
+photo: Les images de l'AFP ont la particularité d'être cadré serré
+pour faire ressortir un élément clé de la scène photographiée. On
+s'attend, d'après l'auteur à obtenir une "variance" proche de 40 (seuil ~ 15).
+
+5 vrai positifs:
+- photo01 ==> 42.9224
+- photo10 ==> 48.0298
+- photo25 ==> 33.6833
+- photo27 ==> 42.9025
+- photo28 ==> 43.5689
+
+des scores faibles:
+-
+
+
+
+
+Test C ("Variance" sur les 16 imagettes):
+-----------------------------------------
\ No newline at end of file
--
1.5.6.5
Introduce new image converter from color to greyscale.
* green/mln/fun/v2v/rgb8_to_int_u8.hh: New image converter.
---
milena/sandbox/ChangeLog | 6 ++++++
.../sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh | 0
2 files changed, 6 insertions(+), 0 deletions(-)
copy {scribo => milena}/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh (100%)
diff --git a/milena/sandbox/ChangeLog b/milena/sandbox/ChangeLog
index acb7027..c928ab7 100644
--- a/milena/sandbox/ChangeLog
+++ b/milena/sandbox/ChangeLog
@@ -77,6 +77,12 @@
2009-12-15 green <jacquelet(a)lrde.epita.fr>
+ Introduce new image converter from color to greyscale.
+
+ * green/mln/fun/v2v/rgb8_to_int_u8.hh: New image converter.
+
+2009-12-15 green <jacquelet(a)lrde.epita.fr>
+
Add new image paths to use the annoting database.
* green/mln/img_path.hh: Update to LRDE norm and add annoting database.
diff --git a/scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh b/milena/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
similarity index 100%
copy from scribo/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
copy to milena/sandbox/green/mln/fun/v2v/rgb8_to_int_u8.hh
--
1.5.6.5