Hello !
Non c'est vraiment pas simple, c'est pour ca que j'ai rien dit pendant plusieurs mois, il a fallu que je calcule pas mal de choses pour essayer de faire quelque chose qui a un sens.
Voici les étapes si vraiment ca vous intéresse, mais je décline toute responsabilité pour les mal de tête que ca peut engendrer :
Avant d'analyser l'image, le système filtre automatiquement les pixels de fond : papier blanc ou ivoire, ombres grises, quadrillages et lignes bleues claires. Cette détection examine la luminosité et la saturation de chaque pixel pour exclure tout ce qui n'est pas de l'encre (pixels très clairs, quasi-achromatiques, ou avec RGB très proches indiquant du gris).
L'extraction des couleurs restantes regroupe les pixels par similarité. Chaque image est chargée et on identifie les 5 groupes de couleurs les plus importants. Pour chaque groupe, le système calcule la couleur moyenne et son pourcentage dans l'image. Ces couleurs sont ensuite stockées dans trois espaces colorimétriques différents (RGB, HSV, LAB) car chacun capture des aspects distincts : RGB pour l'affichage écran, HSV pour séparer teinte et saturation, LAB pour la perception humaine. Cette triple représentation permet d'être un peu plus indépendant des variations d'éclairage ou de qualité d'image.
Le système mesure ensuite la cohérence entre toutes les photos d'une même encre. Pour chaque photo, il calcule l'écart colorimétrique entre ses couleurs dominantes et la moyenne générale de l'encre. Un score de qualité est attribué en analysant les variances de saturation et de teinte : une photo avec des couleurs beaucoup plus vives ou plus ternes que les autres sera pénalisée. Les photos présentant une déviation significative sont automatiquement marquées comme aberrantes (outliers) avec la raison spécifique (éclairage suspect, saturation anormale, teinte décalée). Ces marqueurs aident à identifier les problèmes de prise de vue : flash trop fort, balance des blancs incorrecte, ou même encre partiellement sèche.
C'est ce que je montrais sur un exemple de test juste avant. Et quand je rajoute/retire une image, ca recalcule tout. Donc si vous m'envoyez de belles images, ca améliorera le système !
Chaque encre est finalement représentée par un vecteur de 128 dimensions qui encode ses caractéristiques colorimétriques. La couleur moyenne occupe 45 dimensions (30 en HSV répété, 15 en RGB répété) soit 35% du total pour qu'elle reste le facteur dominant. Les 3 couleurs dominantes et leurs proportions occupent 12 dimensions. Un histogramme de distribution des teintes (18 intervalles de 20°) capture la répartition globale. Les moments statistiques sur H, S et V révèlent la variabilité interne de l'encre. Les caractéristiques perceptuelles (luminosité, chromaticité, pureté) ajoutent une dimension visuelle. Puis, je complete le vecteur avec des calculs d'entropie, poids de la couleur dominante, et la catégorie de couleur encodée. Ce n'était finalement pas le plus complexe (j'utilisais un vecteur plus simple avant, mais ca améliore bien les résultats) une fois que les autres étapes sont bien maitrisée.
La similarité entre deux encres se calcule avec la distance cosinus : plus elle est proche de 1, plus les encres sont similaires. C'est simplifié, comme pour le graph de chromaticité qui n'a que deux dimensions (H, et S normalement, mais moi j'ai remplacé ici le S par un mélange de saturation et luminosité car sinon on avait des encres tres lumineuses (genre Cyan) qui étaient représenté au milieu de verts foncés. Ca estompe un peu ce phénomène. Pour en revenir sur la similarité, c'est la même chose : ca prend en compte tellement de parametres que parfois une encre bleue est plus proche d'une bleu-violette que d'une autre bleue. Et c'est pour ca que j'ai forcé les "45 premières dimensions".
Voila, vous savez tout !
Je vais mettre à jour avec une nouvelle version d'ici quelques jours qui prend tout ce qui est dessus en compte (actuellement une version tres simplifiée est en ligne), je vous tiendrai au courant !