L'exemple de cet article décrit comment implémenter une reconnaissance d'image similaire basée sur une application d'histogramme en Java, ce qui est une technique très pratique. Partagez-le avec tout le monde pour votre référence. L’analyse spécifique est la suivante :
1. Présentation de l'algorithme :
Tout d'abord, collectez les données d'histogramme de l'image source et de l'image à filtrer, normalisez les histogrammes d'image collectés, puis utilisez l'algorithme du coefficient de Babbitt pour calculer les données d'histogramme, et enfin obtenez la valeur de similarité de l'image et sa plage de valeurs entre [0 , 1]
0 signifie extrêmement différent, 1 signifie extrêmement similaire (identique).
2. Explication détaillée des étapes de l'algorithme :
Elle peut être grossièrement divisée en deux étapes, sur la base des données de pixels de l'image source et de l'image candidate, les données d'histogramme respectives sont générées. Étape 2 : utilisez le résultat de l'histogramme de la première étape et utilisez l'algorithme du coefficient Bhattacharyya pour calculer la valeur de similarité.
Étape 1 : Calcul de l'histogramme
Les histogrammes sont divisés en histogrammes en niveaux de gris et histogrammes RVB. Le calcul de l'histogramme d'image en niveaux de gris est très simple. Il suffit d'initialiser un tableau d'histogrammes H avec une taille de 256, puis de compléter les statistiques de distribution de fréquence en fonction de la valeur du pixel. est 124. Alors H[124] += 1, Pour les pixels couleur RVB, il existe deux manières d'exprimer les histogrammes. L'une est un histogramme unique et l'autre est un histogramme tridimensionnel. L'histogramme tridimensionnel est relativement simple et clair. Il correspond aux trois couleurs RVB et les définit. trois histogrammes HR, HG, HB, en supposant que la valeur RVB d'un certain point de pixel P est (4, 231,129), alors le calcul de l'histogramme est HR[4] += 1, HG[231] += 1, HB[129] += 1, après avoir terminé les statistiques pour chaque pixel, les données d'histogramme de couleur RVB sont générées.
L'histogramme unique SH des pixels RVB est légèrement plus compliqué. La plage de valeurs de chaque couleur est comprise entre 0 et 255. On suppose qu'elle peut être divisée en parties égales dans une certaine plage. Lorsqu'il y a 8 parties égales, la plage de valeurs. de chaque partie égale Lorsqu'il y a 32 et 16 parties égales, la plage de valeurs de chaque partie égale est 16. Lorsqu'il y a 4 parties égales, la plage de chaque valeur de partie égale est 64. Supposons que la valeur RVB est (14, 68 , 221), Après 16 parties égales, ses valeurs d'index d'histogramme correspondantes sont : (0, 4, 13), selon la formule de calcul de la valeur d'index : index = R + G*16 + B*16*16
L'indice d'histogramme correspondant = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
De cette façon, toutes les valeurs de pixels RVB sont parcourues pour terminer le calcul des données d'histogramme.
Étape 2 : Calculez le coefficient de Babbitt. La formule de calcul est la suivante :
Parmi eux, P et P' représentent respectivement les données d'histogramme d'image source et candidate. Les racines carrées des produits de chaque point de données avec le même i sont additionnées.
Le résultat est la valeur de similarité de l’image (valeur du facteur de coefficient de lot), qui va de 0 à 1.
L'effet du programme est illustré dans la figure ci-dessous :
La similarité est supérieure à 99 %, extrêmement similaire
Similarité : 72 %, généralement similaire
3. Le code source du calcul de l'histogramme du programme est le suivant :
public void setGreenBinCount(int greenBinCount) { this.greenBins = greenBinCount; } public void setBlueBinCount(int blueBinCount) { this.blueBins = blueBinCount; } public float[] filter(BufferedImage src, BufferedImage dest) { int width = src.getWidth( ); int hauteur = src.getHeight(); inPixels = new int[largeur*hauteur]; float[] histogramData = new float[redBins * greenBins * blueBins]; src, 0, 0, width, int index = 0; greenIdx = 0, blueIdx = 0; int singleIndex = 0; float total = 0; rangée=0; rangée<hauteur; rangée++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<largeur; col++) { index = rangée * largeur + col; ta = (inPixels[index] >> 24) & 0xff; tr = (inPixels[index] >> 16) & 0xff; (inPixels[index] >> 8) & 0xff; tb = inPixels[index] & 0xff; redIdx = (int)getBinIndex(redBins, tr, 255); = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; histogramData[singleIndex] += 1; total += 1; .length; i++) { histogramData[i] = histogramData[i] / total } return; histogrammeData; }Le code pour calculer le coefficient de Bath est le suivant :
/** * Coefficient Bhattacharyya * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf * * @return */ public double modelMatch() { HistogramFilter hfilter = new HistogramFilter(); sourceData = hfilter.filter(sourceImage, null); float[] candidateData = hfilter.filter(candidateImage, null); double[] MixedData = new double[sourceData.length]; for(int i=0; i<sourceData.length; i++ ) { MixedData[i] = Math.sqrt(sourceData[i] * candidateData[i] ); } // Les valeurs du coefficient Bhattacharyya vont de 0 à 1, double similarité = 0; for(int i=0; i<mixedData.length; i++ ) { similarity += MixedData[i]; } // Le degré de similarité renvoie la similarité ;J'espère que cet article sera utile à la programmation Java de chacun.