Depuis eznme n'a pas répondu à votre question (Vous voulez empreintes digitales, il explique la compression et la reconstruction), voici une méthode que vous allez souvent rencontré:
Vous séparer la couleur et la luminosité des informations (chrominance et Luma), et les peser différemment. Parfois, vous jetez même la chrominance et utilisez simplement la partie luma. Cela réduit considérablement la taille de votre empreinte digitale (~ facteur 3) et prend en compte la façon dont nous percevons une image - principalement par la luminosité locale, et non par la couleur absolue. En prime vous gagnez de la robustesse en ce qui concerne la manipulation des couleurs de l'image.
La séparation peut être effectuée de différentes manières, par ex. la transformation de votre image RVB en ou YIQ espace colorimétrique. Si vous voulez seulement conserver le composant luma, ces deux espaces de couleur sont équivalents. Cependant, ils encodent la chrominance différemment. est ici la transformation linéaire pour la luma Y du RGB: Y = 0,299 * R + 0,587 * G + 0,114 * B
Lorsque vous regardez les mathématiques, vous remarquez que nous ne faisons rien d'autre que de créer une image en niveaux de gris - en tenant compte du fait que nous percevons le vert plus lumineux que le rouge et le rouge que le bleu quand ils sont tous numériquement égaux. Si vous souhaitez conserver un peu d'informations de chrominance, afin de conserver une empreinte aussi concise que possible, vous pouvez réduire la résolution des deux composants U et V (8 bits chacun). Donc, vous pouvez les joindre en une seule valeur de 8 bits en réduisant leurs informations à 4 bits et en les combinant avec l'opérateur de décalage (ne sais pas comment cela fonctionne en Java). La chrominance devrait peser moins par rapport à la luma, dans le calcul final de la distance entre les empreintes digitales (le produit scalaire que vous avez mentionné).