이 기사의 예에서는 매우 실용적인 기술인 Java의 히스토그램 응용 프로그램을 기반으로 유사한 이미지 인식을 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
1. 알고리즘 개요:
먼저 원본 영상과 필터링할 영상의 히스토그램 데이터를 수집하고 수집된 영상 히스토그램을 정규화한 후 Babbitt 계수 알고리즘을 사용하여 히스토그램 데이터를 계산하고 최종적으로 영상 유사도 값과 [0 사이의 값 범위를 구합니다. , 1]
0은 매우 다름을 의미하고, 1은 매우 유사함(동일함)을 의미합니다.
2. 알고리즘 단계에 대한 자세한 설명:
이는 크게 두 단계로 나눌 수 있으며, 원본 이미지와 후보 이미지의 픽셀 데이터를 기반으로 각각의 히스토그램 데이터가 생성됩니다. 2단계: 첫 번째 단계에서 출력된 히스토그램 결과를 사용하고 Bhattacharyya 계수 알고리즘을 사용하여 유사도 값을 계산합니다.
1단계: 히스토그램 계산
히스토그램은 회색조 히스토그램과 RGB 히스토그램으로 나누어집니다. 회색조 이미지 히스토그램의 계산은 매우 간단합니다. 히스토그램 배열 H를 크기 256으로 초기화한 다음 픽셀 값을 기준으로 완전한 빈도 분포 통계를 가정합니다. 는 124입니다. 그러면 H[124] += 1, 컬러 RGB 픽셀의 경우 히스토그램을 표현하는 방법에는 두 가지가 있는데, 하나는 단일 히스토그램이고, 다른 하나는 3차원 히스토그램은 RGB의 세 가지 색상에 해당하며 정의합니다. 3개의 히스토그램. HR, HG, HB, 특정 픽셀 포인트 P의 RGB 값이 (4,231,129)라고 가정하면 히스토그램 계산은 HR[4] += 1, HG[231] += 1, HB[129] += 1, 각 픽셀에 대한 통계를 완료한 후 RGB 색상 히스토그램 데이터가 생성됩니다.
RGB 픽셀의 단일 히스토그램 SH는 약간 더 복잡합니다. 각 색상의 값 범위는 0에서 255 사이입니다. 특정 범위에서 동일한 부분으로 나눌 수 있다고 가정합니다. 각 동일 부분의 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단계: Babbitt 계수를 계산합니다. 계산 공식은 다음과 같습니다.
그 중 P와 P'는 각각 소스 이미지 히스토그램 데이터와 후보 이미지 히스토그램 데이터를 나타내며, 동일한 i를 갖는 각 데이터 포인트의 곱의 제곱근을 더한 것입니다.
결과는 0~1 범위의 이미지 유사성 값(배치 계수 인자 값)입니다.
프로그램 효과는 아래 그림에 표시됩니다.
유사도가 99% 이상, 매우 유사함
유사성: 72%, 일반적으로 유사함
3. 프로그램 히스토그램 계산 소스 코드는 다음과 같습니다.
공개 무효 setGreenBinCount(int greenBinCount) { this.greenBins = greenBinCount; } 공개 무효 setBlueBinCount(int blueBinCount) { this.blueBins = blueBinCount; } 공개 float[] 필터(BufferedImage src, BufferedImage dest) { int width = src.getWidth( ); int 높이 = src.getHeight(); inPixels = new int[width*height]; float[] histogramData = new float[redBins * greenBins * blueBins]; getRGB( src, 0, 0, width, height, int index = 0, greenIdx = 0, blueIdx = 0; int SingleIndex = 0 for(int) 행=0; 행<높이; 행++) { int ta = 0, tr = 0, tb = 0; for(int col=0; col<width; col++) { index = 행 * 너비 + col; ta = (inPixels[인덱스] >> 24) & 0xff tr = (inPixels[인덱스] >> 16) & tg = (inPixels[index] >> 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; i++) { histogramData[i] = histogramData[i] / 합계 } 반환 히스토그램데이터 }Bath 계수를 계산하는 코드는 다음과 같습니다.
/** * 바타차리야 계수 * 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[] mixData = new double[sourceData.length]; for(int i=0; i<sourceData.length; i++ ) { mixData[i] = Math.sqrt(sourceData[i] * CandidateData[i] ); } // 바타차리야 계수(Bhattacharyya Coefficient) 값의 범위는 0에서 1, 이중 유사성 = 0 for(int i=0; i<mixedData.length; i++ ) { 유사성 += MixedData[i]; } // 유사도는 유사성을 반환합니다. }이 글이 모든 사람의 Java 프로그래밍에 도움이 되기를 바랍니다.