El ejemplo de este artículo describe cómo implementar un reconocimiento de imágenes similar basado en una aplicación de histograma en Java, que es una técnica muy práctica. Compártelo con todos para tu referencia. El análisis específico es el siguiente:
1. Descripción general del algoritmo:
Primero, recopile datos de histograma de la imagen de origen y la imagen que se va a filtrar, normalice los histogramas de imágenes recopilados y luego use el algoritmo del coeficiente de Babbitt para calcular los datos del histograma y, finalmente, obtenga el valor de similitud de la imagen y su rango de valores entre [0 , 1]
0 significa extremadamente diferente, 1 significa extremadamente similar (igual).
2. Explicación detallada de los pasos del algoritmo:
Se puede dividir aproximadamente en dos pasos. Según los datos de píxeles de la imagen de origen y la imagen candidata, se generan los datos del histograma respectivos. Paso 2: utilice el resultado del histograma del primer paso y utilice el algoritmo del coeficiente de Bhattacharyya para calcular el valor de similitud.
Paso 1: cálculo del histograma
Los histogramas se dividen en histogramas en escala de grises e histogramas RGB. El cálculo del histograma de la imagen en escala de grises es muy simple: simplemente inicialice una matriz de histograma H con un tamaño de 256 y luego complete las estadísticas de distribución de frecuencia según el valor del píxel. es 124. Entonces H[124] += 1, Para los píxeles RGB de color, hay dos formas de expresar histogramas: uno es un histograma único y el otro es un histograma tridimensional. El histograma tridimensional es relativamente simple y claro. Corresponde a los tres colores de RGB. tres histogramas HR, HG, HB, suponiendo que el valor RGB de un determinado punto de píxel P es (4, 231,129), entonces el cálculo del histograma es HR [4] += 1, HG [231] += 1, HB[129] += 1, después de completar las estadísticas para cada píxel, se generan datos del histograma de color RGB.
El histograma único SH de píxeles RGB es un poco más complicado. El rango de valores de cada color está entre 0 y 255. Se supone que se puede dividir en partes iguales en un rango determinado. Cuando hay 8 partes iguales, el rango de valores. de cada parte igual Cuando son 32 y 16 partes iguales, el rango de valores de cada parte igual es 16. Cuando son 4 partes iguales, el rango de cada valor de partes iguales es 64. Suponga que el valor RGB es (14, 68 , 221), Después de 16 partes iguales, sus valores de índice de histograma correspondientes son: (0, 4, 13), según la fórmula para calcular el valor del índice: índice = R + G*16 + B*16*16
El índice de histograma correspondiente = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
De esta manera, se atraviesan todos los valores de píxeles RGB para completar el cálculo de los datos del histograma.
Paso 2: Calcule el coeficiente de Babbitt. La fórmula de cálculo es la siguiente:
Entre ellos, P y P' representan los datos del histograma de la imagen fuente y candidata, respectivamente. Las raíces cuadradas de los productos de cada punto de datos con la misma i se suman.
El resultado es el valor de similitud de la imagen (valor del factor del coeficiente de lote), que varía de 0 a 1.
El efecto del programa se muestra en la siguiente figura:
La similitud es superior al 99%, extremadamente similar.
Similitud: 72%, generalmente similar
3. El código fuente del cálculo del histograma del programa es el siguiente:
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 altura = src.getHeight(); int[] inPixels = new int[ancho*alto]; float[] histogramData = new float[redBins * greenBins * blueBins]; getRGB( src, 0, 0, ancho, alto, int index = 0); greenIdx = 0, blueIdx = 0; int singleIndex = 0; flotante total = 0; fila=0; fila<altura; fila++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<ancho; col++) { índice = fila * ancho + col; ta = (enPíxeles[índice] >> 24) & 0xff; tr = (enPíxeles[índice] >> 16) & 0xff; (inPixels[índice] >> 8) & 0xff; tb = inPixels[índice] & 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 } retorno; histogramaDatos; }El código para calcular el coeficiente de Bath es el siguiente:
/** * Coeficiente de Bhattacharyya * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf * * @return */ public double modelMatch() { HistogramFilter hfilter = new HistogramFilter() float[] sourceData = hfilter.filter(sourceImage, null); float[] candidatoData = hfilter.filter(candidateImage, nulo); doble[] datosmixtos = nuevo doble[sourceData.length]; for(int i=0; i<sourceData.length; i++) { MixedData[i] = Math.sqrt(sourceData[i] * candidatoData[i] } } // Los valores del coeficiente de Bhattacharyya varían de 0 a 1, doble similitud = 0; for(int i=0; i<mixedData.length; i++ ) { similitud += MixedData[i]; } // El grado de similitud devuelve similitud;Espero que este artículo sea útil para la programación Java de todos.