O exemplo neste artigo descreve como implementar reconhecimento de imagem semelhante baseado na aplicação de histograma em Java, que é uma técnica muito prática. Compartilhe com todos para sua referência. A análise específica é a seguinte:
1. Visão geral do algoritmo:
Primeiro, colete os dados do histograma da imagem de origem e da imagem a ser filtrada, normalize os histogramas da imagem coletada e, em seguida, use o algoritmo do coeficiente de Babbitt para calcular os dados do histograma e, finalmente, obtenha o valor de similaridade da imagem e sua faixa de valores entre [0 , 1]
0 significa extremamente diferente, 1 significa extremamente semelhante (igual).
2. Explicação detalhada das etapas do algoritmo:
Ele pode ser dividido aproximadamente em duas etapas. Com base nos dados de pixel da imagem de origem e da imagem candidata, os respectivos dados do histograma são gerados. Etapa 2: Use a saída do resultado do histograma da primeira etapa e use o algoritmo do coeficiente Bhattacharyya para calcular o valor de similaridade.
Etapa 1: cálculo do histograma
Os histogramas são divididos em histogramas em escala de cinza e histogramas RGB. O cálculo do histograma da imagem em escala de cinza é muito simples. Basta inicializar uma matriz de histograma H com tamanho de 256 e, em seguida, completar as estatísticas de distribuição de frequência com base no valor do pixel. é 124. Então H[124] += 1, Para pixels RGB coloridos, existem duas maneiras de expressar histogramas. Uma é um histograma único e a outra é um histograma tridimensional. O histograma tridimensional é relativamente simples e claro. três histogramas HR, HG, HB, assumindo que o valor RGB de um determinado ponto de pixel P é (4.231.129), então o cálculo do histograma é HR[4] += 1, HG[231] += 1, HB[129] += 1, após completar as estatísticas para cada pixel, os dados do histograma de cores RGB são gerados.
O histograma SH único de pixels RGB é um pouco mais complicado. O intervalo de valores de cada cor está entre 0 e 255. Supõe-se que ele pode ser dividido em partes iguais em um determinado intervalo. de cada parte igual Quando são 32 e 16 partes iguais, o intervalo de valores de cada parte igual é 16. Quando são 4 partes iguais, o intervalo de valores de cada parte igual é 64. Suponha que o valor RGB seja (14, 68 , 221), Após 16 partes iguais, seus valores de índice do histograma correspondentes são: (0, 4, 13), conforme fórmula de cálculo do valor do índice: índice = R + G*16 + B*16*16
O índice do histograma correspondente = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
Desta forma, todos os valores de pixel RGB são percorridos para completar o cálculo dos dados do histograma.
Etapa 2: Calcule o coeficiente de Babbitt A fórmula de cálculo é a seguinte:
Entre eles, P e P' representam os dados do histograma da imagem fonte e candidata, respectivamente. As raízes quadradas dos produtos de cada ponto de dados com o mesmo i são somadas.
O resultado é o valor de similaridade da imagem (valor do fator do coeficiente do lote), que varia de 0 a 1.
O efeito do programa é mostrado na figura abaixo:
A semelhança é superior a 99%, extremamente semelhante
Semelhança: 72%, geralmente semelhante
3. O código-fonte do cálculo do histograma do programa é o seguinte:
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(); inPixels = new int[largura*altura]; float[] histogramData = new float[redBins * greenBins * blueBins]; verdeIdx = 0, azulIdx = 0; int singleIndex = 0; linha=0; linha<altura linha++) { int ta = 0, tr = 0, tg = 0, tb = 0; ta = (inPixels[índice] >> 24) & 0xff tr = (inPixels[índice] >> 16) & 0xff; (inPixels[índice] >> 8) & 0xff tb = inPixels[índice] & 0xff = (int)getBinIndex(redBins, tr, 255); = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * histogramData[singleIndex] += 1 total += 1; .length; i++) { histogramaData[i] = histogramData[i] / total } retorno; histogramaDados;O código para calcular o coeficiente de Bath é o seguinte:
/** * Coeficiente 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[] 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] ); } // Os valores do Coeficiente Bhattacharyya variam de 0 a 1, double similarity = 0; for(int i=0; i<mixedData.length; i++ ) { similarity += mixedData[i]; } // O grau de similaridade retorna similaridade }Espero que este artigo seja útil para a programação Java de todos.