Contoh dalam artikel ini menjelaskan cara mengimplementasikan pengenalan gambar serupa berdasarkan aplikasi histogram di Java, yang merupakan teknik yang sangat praktis. Bagikan dengan semua orang untuk referensi Anda. Analisis spesifiknya adalah sebagai berikut:
1. Ikhtisar Algoritma:
Pertama, kumpulkan data histogram gambar sumber dan gambar yang akan difilter, normalkan histogram gambar yang dikumpulkan, lalu gunakan algoritma koefisien Babbitt untuk menghitung data histogram, dan terakhir dapatkan nilai kemiripan gambar, dan rentang nilainya antara [0 , 1]
0 artinya sangat berbeda, 1 artinya sangat mirip (sama).
2. Penjelasan rinci tentang langkah-langkah algoritma:
Secara kasar dapat dibagi menjadi dua langkah. Berdasarkan data piksel gambar sumber dan gambar kandidat, masing-masing data histogram dihasilkan. Langkah 2: Gunakan keluaran hasil histogram dari langkah pertama dan gunakan algoritma koefisien Bhattacharyya untuk menghitung nilai kemiripan.
Langkah 1: Perhitungan histogram
Histogram dibagi menjadi histogram skala abu-abu dan histogram RGB. Perhitungan histogram gambar skala abu-abu sangat sederhana, cukup inisialisasi array histogram H dengan ukuran 256, lalu selesaikan statistik distribusi frekuensi berdasarkan nilai piksel adalah 124. Maka H[124] += 1, Untuk piksel warna RGB, ada dua cara untuk mengekspresikan histogram. Yang pertama adalah histogram tunggal, dan yang lainnya adalah histogram tiga dimensi. Histogram tiga dimensi relatif sederhana dan jelas tiga histogram HR, HG, HB, dengan asumsi nilai RGB suatu titik piksel P adalah (4, 231,129), maka perhitungan histogramnya adalah HR[4] += 1, HG[231] += 1, HB[129] += 1, setelah menyelesaikan statistik untuk setiap piksel, data histogram warna RGB dihasilkan.
Histogram tunggal SH piksel RGB sedikit lebih rumit. Kisaran nilai setiap warna adalah antara 0 dan 255. Diasumsikan bahwa ia dapat dibagi menjadi bagian yang sama dalam rentang tertentu, ketika ada 8 bagian yang sama, rentang nilainya dari setiap bagian yang sama Jika terdiri dari 32 dan 16 bagian yang sama, rentang nilai setiap bagian yang sama adalah 16. Jika terdapat 4 bagian yang sama, rentang nilai setiap bagian yang sama adalah 64. Asumsikan nilai RGB adalah (14, 68 , 221), Setelah 16 bagian yang sama, nilai indeks histogram yang sesuai adalah: (0, 4, 13), sesuai rumus menghitung nilai indeks: indeks = R + G*16 + B*16*16
Indeks histogram yang sesuai = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
Dengan cara ini, semua nilai piksel RGB dilintasi untuk menyelesaikan penghitungan data histogram.
Langkah 2: Hitung koefisien Babbitt. Rumus perhitungannya adalah sebagai berikut:
Diantaranya, P dan P' masing-masing mewakili data histogram gambar sumber dan kandidat. Akar kuadrat dari hasil kali setiap titik data dengan i yang sama dijumlahkan.
Hasilnya adalah nilai kesamaan gambar (nilai faktor koefisien Batch) yang berkisar antara 0 hingga 1.
Efek program ditunjukkan pada gambar di bawah ini:
Kemiripannya lebih dari 99%, sangat mirip
Kemiripan: 72%, umumnya serupa
3. Kode sumber perhitungan histogram program adalah sebagai berikut:
public void setGreenBinCount(int greenBinCount) { this.greenBins = greenBinCount; } public void setBlueBinCount(int blueBinCount) { this.blueBins = blueBinCount; } public float[] filter(BufferedImage src, BufferedImage tujuan) { int width = src.getWidth( ); int tinggi = src.getHeight(); int[] inPixels = int baru[lebar*tinggi]; float[] histogramData = float baru[redBins * greenBins * blueBins]; getRGB( src, 0, 0, lebar, tinggi, int indeks = 0; greenIdx = 0, blueIdx = 0; int singleIndex = 0; float total = 0; baris=0; baris<tinggi; baris++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<width; col++) { indeks = baris * lebar + kolom; ta = (dalam Piksel[indeks] >> 24) & 0xff; tr = (dalam Piksel[indeks] >> 16) & 0xff; (inPixels[index] >> 8) & 0xff; = inPixels[index] & 0xff; = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; histogramData[singleIndex] += 1; total += 1 } // mulai menormalkan data histogram untuk (int i = 0; i < histogramData .panjang; i++) { histogramData[i] = histogramData[i] / total } kembali Data histogram; }Kode untuk menghitung koefisien Bath adalah sebagai berikut:
/** * Koefisien Bhattacharyya * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf * * @return */ public double modelMatch() { HistogramFilter hfilter = new HistogramFilter(); sourceData = hfilter.filter(sourceImage, null); float[] kandidatData = hfilter.filter(candidateImage, null); ganda[] mixedData = double[sourceData.length] baru; for(int i=0; i<sourceData.length; i++ ) { mixedData[i] = Math.sqrt(sourceData[i] * kandidatData[i] } // Nilai Koefisien Bhattacharyya berkisar antara 0 sampai 1, kesamaan ganda = 0; for(int i=0; i<mixedData.length; i++ ) { kesamaan += mixedData[i]; } // Derajat kesamaan mengembalikan kesamaan; }Saya harap artikel ini bermanfaat untuk pemrograman Java semua orang.