Das Beispiel in diesem Artikel beschreibt, wie eine ähnliche Bilderkennung basierend auf der Histogrammanwendung in Java implementiert wird, was eine sehr praktische Technik ist. Teilen Sie es als Referenz mit allen. Die spezifische Analyse lautet wie folgt:
1. Algorithmusübersicht:
Sammeln Sie zunächst die Histogrammdaten des Quellbilds und des zu filternden Bilds, normalisieren Sie die gesammelten Bildhistogramme und verwenden Sie dann den Babbitt-Koeffizientenalgorithmus, um die Histogrammdaten zu berechnen, und erhalten Sie schließlich den Bildähnlichkeitswert und seinen Wertebereich zwischen [0 , 1]
0 bedeutet extrem unterschiedlich, 1 bedeutet extrem ähnlich (gleich).
2. Detaillierte Erläuterung der Algorithmusschritte:
Es kann grob in zwei Schritte unterteilt werden. Basierend auf den Pixeldaten des Quellbilds und des Kandidatenbilds werden die jeweiligen Histogrammdaten generiert. Schritt 2: Verwenden Sie die Histogramm-Ergebnisausgabe aus dem ersten Schritt und verwenden Sie den Bhattacharyya-Koeffizientenalgorithmus, um den Ähnlichkeitswert zu berechnen.
Schritt 1: Histogrammberechnung
Histogramme werden in Graustufenhistogramme und RGB-Histogramme unterteilt. Die Berechnung des Graustufenbildhistogramms ist einfach. Initialisieren Sie einfach ein Histogrammarray H mit einer Größe von 256 und erstellen Sie dann eine Häufigkeitsverteilungsstatistik basierend auf dem Pixelwert ist 124. Dann ist H[124] += 1, Für Farb-RGB-Pixel gibt es zwei Möglichkeiten, ein Histogramm auszudrücken, und das andere ist ein dreidimensionales Histogramm. Es entspricht den drei Farben von RGB Drei Histogramme. HR, HG, HB. Unter der Annahme, dass der RGB-Wert eines bestimmten Pixelpunkts P (4, 231,129) ist, lautet die Histogrammberechnung HR[4] += 1, HG[231] += 1, HB[129] += 1, nach Abschluss der Statistiken für jedes Pixel werden RGB-Farbhistogrammdaten generiert.
Das einzelne Histogramm SH von RGB-Pixeln ist etwas komplizierter. Der Wertebereich jeder Farbe liegt zwischen 0 und 255. Es wird davon ausgegangen, dass sie in einen bestimmten Bereich unterteilt werden kann jedes gleichen Teils. Wenn es 32 und 16 gleiche Teile sind, beträgt der Wertebereich jedes gleichen Teils 16. Wenn es 4 gleiche Teile sind, beträgt der Wertebereich jedes gleichen Teils 64. Angenommen, der RGB-Wert ist (14, 68 , 221), Nach 16 gleichen Teilen sind die entsprechenden Histogramm-Indexwerte: (0, 4, 13), gemäß der Formel zur Berechnung des Indexwerts: Index = R + G*16 + B*16*16
Der entsprechende Histogrammindex = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
Auf diese Weise werden alle RGB-Pixelwerte durchlaufen, um die Berechnung der Histogrammdaten abzuschließen.
Schritt 2: Berechnen Sie den Babbitt-Koeffizienten. Die Berechnungsformel lautet wie folgt:
Unter diesen stellen P und P' die Quell- bzw. Kandidatenbildhistogrammdaten dar. Die Quadratwurzeln der Produkte jedes Datenpunkts mit demselben i werden addiert.
Das Ergebnis ist der Bildähnlichkeitswert (Batch-Koeffizientenfaktorwert), der zwischen 0 und 1 liegt.
Der Programmeffekt ist in der folgenden Abbildung dargestellt:
Die Ähnlichkeit beträgt über 99 %, extrem ähnlich
Ähnlichkeit: 72 %, im Allgemeinen ähnlich
3. Der Quellcode der Programmhistogrammberechnung lautet wie folgt:
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 height = src.getHeight(); inPixels = new int[width*height]; float[] histogramData = new float[redBins * greenBins]; getRGB( src, 0, 0, width, height, int index = 0, greenIdx = 0, blueIdx = 0; int singleIndex = 0; float total = 0; row=0; row<height; row++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<width; col++) { index = row * width + col; ta = (inPixels[index] >> 24) & 0xff; tr = (inPixels[index] >> 16) & tg = (inPixels[index] >> 8) & 0xff; = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins * greenBins; .length; i++) { histogramData[i] = histogramData[i] / total } return; HistogramData;Der Code zur Berechnung des Bath-Koeffizienten lautet wie folgt:
/** * Bhattacharyya-Koeffizient * 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] ); } // Die Werte des Bhattacharyya-Koeffizienten reichen von 0 bis 1, doppelte Ähnlichkeit = 0; } // Der Grad der Ähnlichkeit gibt Ähnlichkeit zurück }Ich hoffe, dass dieser Artikel für die Java-Programmierung aller hilfreich sein wird.