Пример в этой статье описывает, как реализовать подобное распознавание изображений на основе приложения гистограммы в Java, что является очень практичным методом. Поделитесь этим со всеми для справки. Конкретный анализ заключается в следующем:
1. Обзор алгоритма:
Сначала соберите данные гистограммы исходного изображения и изображения, подлежащего фильтрации, нормализуйте собранные гистограммы изображения, а затем используйте алгоритм коэффициента Бэббита для расчета данных гистограммы и, наконец, получите значение сходства изображения и диапазон его значений между [0 , 1]
0 означает очень разные, 1 означает очень похожие (одинаковые).
2. Подробное объяснение шагов алгоритма:
Его можно грубо разделить на два этапа на основе данных пикселей исходного изображения и изображения-кандидата генерируются соответствующие данные гистограммы. Шаг 2. Используйте результаты гистограммы, полученные на первом этапе, и используйте алгоритм коэффициента Бхаттачарьи для расчета значения сходства.
Шаг 1: Расчет гистограммы
Гистограммы делятся на гистограммы в оттенках серого и гистограммы RGB. Вычисление гистограммы изображения в оттенках серого очень просто. Просто инициализируйте массив гистограмм H размером 256, а затем заполните статистику распределения частот на основе значения пикселя. равно 124. Тогда H[124] += 1, Для цветных пикселей RGB существует два способа представления гистограмм: один — это одна гистограмма, а другой — трехмерная гистограмма. Трехмерная гистограмма относительно проста и понятна. Она соответствует трем цветам RGB и определяет. три гистограммы HR, HG, HB, предполагая, что значение RGB определенной точки пикселя P равно (4, 231,129), тогда расчет гистограммы будет HR[4] += 1, HG[231] += 1, HB[129] += 1, после завершения статистики для каждого пикселя генерируются данные цветовой гистограммы RGB.
Одиночная гистограмма SH пикселей RGB немного сложнее. Диапазон значений каждого цвета составляет от 0 до 255. Предполагается, что его можно разделить на равные части в определенном диапазоне. Когда имеется 8 равных частей, диапазон значений. каждой равной части. Если 32 и 16 равных частей, диапазон значений каждой равной части равен 16. Если 4 равные части, диапазон значений каждой равной части равен 64. Предположим, что значение RGB равно (14, 68). , 221), После 16 равных частей соответствующие ей значения индекса гистограммы составляют: (0, 4, 13), согласно формуле расчета значения индекса: индекс = R + G*16 + B*16*16.
Соответствующий индекс гистограммы = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
Таким образом, все значения пикселей RGB просматриваются для завершения расчета данных гистограммы.
Шаг 2: Рассчитайте коэффициент Бэббита. Формула расчета следующая:
Среди них P и P' представляют данные гистограммы изображения источника и кандидата соответственно. Квадратные корни произведений каждой точки данных с одинаковым i складываются.
Результатом является значение сходства изображения (значение коэффициента пакетного коэффициента), которое находится в диапазоне от 0 до 1.
Эффект программы показан на рисунке ниже:
Сходство более 99%, очень похоже.
Сходство: 72%, в целом похоже.
3. Исходный код программы расчета гистограммы следующий:
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 высота = src.getHeight(); int[] inPixels = новый int[ширина*высота]; float[] histogramData = новый float[redBins * greenBins * blueBins]; getRGB (src, 0, 0, ширина, высота, int index = 0; int redIdx = 0, greenIdx = 0, blueIdx = 0; int SingleIndex = 0; общее количество с плавающей запятой = 0; строка=0; строка<высота; строка++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<width; col++) { index = row * width + col; та = (inPixels[индекс] >> 24) & 0xff tr = (inPixels[индекс] >> 16) & 0xff; (inPixels[индекс] >> 8) & 0xff; tb = inPixels[index] & 0xff; redIdx = (int)getBinIndex(redBins, tr, 255); greenIdx = (int)getBinIndex(greenBins, tg, 255); = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; histogramData[singleIndex] += 1; total += 1; } } // начинаем нормализовать данные гистограммы для (int i = 0; i < histogramData). .length; я++) { histogramData[i] = histogramData[i]/total } return; данные гистограммы }Код для расчета коэффициента Бата выглядит следующим образом:
/** * Коэффициент Бхаттачарья * 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++) {mixData[i] = Math.sqrt(sourceData[i] *dependentData[i] } // Значения коэффициента Бхаттачарьи варьируются от 0 до 1, двойное сходство = 0; for(int i=0; i<mixedData.length; i++ ) { сходство += mixData[i]; } // Степень сходства возвращаем сходство }Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.