この記事の例では、Java でヒストグラム アプリケーションに基づく類似画像認識を実装する方法を説明します。これは非常に実用的な手法です。皆さんの参考に共有してください。具体的な分析は次のとおりです。
1. アルゴリズムの概要:
まず、ソース画像とフィルタリング対象の画像のヒストグラム データを収集し、収集した画像ヒストグラムを正規化してから、バビット係数アルゴリズムを使用してヒストグラム データを計算し、最終的に画像の類似度値とその値の範囲を取得します。 、1]
0 は非常に異なることを意味し、1 は非常に似ている (同じ) ことを意味します。
2. アルゴリズムのステップの詳細な説明:
大きく分けて、元画像と候補画像の画素データに基づいて、それぞれのヒストグラムデータを生成する。ステップ 2: 最初のステップで出力されたヒストグラム結果を使用し、Bhattacharyya 係数アルゴリズムを使用して類似度値を計算します。
ステップ 1: ヒストグラムの計算
ヒストグラムは、グレースケール ヒストグラムと RGB ヒストグラムに分けられます。グレースケール イメージ ヒストグラムの計算は、サイズ 256 のヒストグラム配列 H を初期化し、ピクセル値に基づいて頻度分布統計を完了するだけです。は 124 です。その場合、H[124] += 1、カラー RGB ピクセルのヒストグラムには、単一のヒストグラムと 3 次元のヒストグラムの 2 つの方法があります。3 次元のヒストグラムは、RGB の 3 つの色に対応して定義されます。 HR、HG、HB の 3 つのヒストグラム。特定のピクセル点 P の RGB 値が (4, 231,129) であると仮定すると、ヒストグラムの計算は HR[4] += 1、HG[231] += 1、 HB[129] += 1、各ピクセルの統計が完了した後、RGB カラー ヒストグラム データが生成されます。
RGB ピクセルの単一ヒストグラム SH は少し複雑ですが、各色の値の範囲は 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.blueBinCount; } public float[] filter(BufferedImage src, BufferedImage dest) { int width = src.getWidth( ); int 高さ = src.getHeight(); inPixels = new int[width*height]; float[] histogramData = new float[redBins * greenBins]; getRGB( src, 0, 0, width, height, inPixels ); int redIdx = 0, greenIdx = 0、blueIdx = 0; int singleIndex = 0; float の合計 = 0;行 = 0; 行<高さ; 行++) { int ta = 0, tr = 0, tg = 0; for(int col=0; 列<幅; 列++) { インデックス = 行 * 幅 + 列; ta = (inPixels[インデックス] >> 24) & 0xff; tr = (inPixels[インデックス] >> 16) & tg = (inPixels[インデックス] >> 8) & 0xff; tb = inPixels[インデックス] & 0xff; redIdx = (int)getBinIndex(redBins, tr, 255); = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; histogramData[singleIndex] += 1; } } // (int i = 0; i < histogramData) のヒストグラム データの正規化を開始します.length; i++) { ヒストグラムデータ [i] = ヒストグラムデータ [i] / 合計;ヒストグラムデータ;Bath 係数を計算するコードは次のとおりです。
/** * Bhattacharyya 係数 * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf * * @return */ public double modelMatch() { HistogramFilter hfilter = new HistogramFilter();ソースデータ = hfilter.filter(sourceImage, null); float[] 候補データ = 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] ); } // バタチャリヤ係数の値の範囲は 0 から 1、倍精度 = 0; for(int i=0; i<mixedData.length; i++ ) { 類似度 +=mixedData[i]; } // 類似度は類似度を返します。この記事が皆さんの Java プログラミングに役立つことを願っています。