Transformasi jarak chamfer dalam pemrosesan gambar sering digunakan dalam pengenalan pencocokan objek. Algoritma ini pada dasarnya menghasilkan nilai jarak masing -masing piksel berdasarkan jendela 3x3, dan dibagi menjadi dua langkah untuk menyelesaikan transformasi jarak. Langkah pertama dimulai dari sudut kiri atas, memindai setiap piksel dari kiri ke kanan, dari atas ke bawah, dan mendeteksi empat piksel di sekitar piksel pusat X, dan menghemat jarak dan posisi minimum sebagai hasilnya. Angka tersebut adalah sebagai berikut:
Langkah kedua adalah mendeteksi jarak minimum dan posisi piksel yang berdekatan 4, 5, 6, 7 dari bawah ke kanan ke kiri, sebagai hasilnya, untuk setiap piksel:
Setelah menyelesaikan dua langkah ini, output hasil adalah hasil dari transformasi jarak chamfer. Implementasi Kode Transformasi Jarak Jarak Tali Lengkap dapat dibagi menjadi langkah -langkah berikut:
1. Inisialisasi array piksel, jarak awal dari semua piksel warna latar belakang tidak terbatas, dan jarak piksel latar depan adalah 0.
2. Mulai langkah pertama dalam transformasi jarak talang dan simpan hasilnya
3. Lengkapi langkah kedua dalam transformasi jarak talang berdasarkan hasil langkah pertama
4. Menampilkan semua nilai grayscale yang berbeda sesuai dengan hasil transformasi jarak untuk membentuk gambar
Hasil akhir ditampilkan sebagai berikut (kiri menunjukkan gambar asli dan kanan menunjukkan hasil setelah CDT)
Kode Sumber untuk Transformasi Jarak Chamfer Gambar Biner Lengkap adalah sebagai berikut:
paket com.gloomyfish.image.transform; impor java.awt.color; impor java.awt.image.bufferedimage; impor java.util.arrays; impor com.gloomyfish.filter.study.abstractbufferedImageop; cdtfilter kelas publik memperluas abstrakbufferedImageop {private float [] dis; // nn-distances int [] pos; // NN-POSISI, 32 bit indeks Bakcgroundcolor warna pribadi; cdtfilter publik (warna bgcolor) {this.bakcgroundColor = bgcolor; } @Override Public BufferedImage Filter (BufferedImage SRC, BufferedImage Dest) {int width = src.getWidth (); int tinggi = src.getHeight (); if (dest == null) dest = createCompatibledestimage (src, null); int [] inpixels = int baru [lebar * tinggi]; POS = int baru [lebar * tinggi]; dis = float baru [lebar * tinggi]; src.getrgb (0, 0, lebar, tinggi, inpixels, 0, lebar); // Indeks transformasi jarak jauh yang dihasilkan secara acak int indeks = 0; Arrays.fill (dis, float.max_value); int numoffc = 0; untuk (int baris = 0; baris <tinggi; baris ++) {untuk (int col = 0; col <width; col ++) {index = baris * lebar+col; if (inpixels [index]! = bakcgroundColor.getRgb ()) {dis [index] = 0; POS [indeks] = indeks; numoffc ++; }}} float final d1 = 1; Final float d2 = (float) math.sqrt (d1 * d1 + d1 * d1); System.out.println (numoffc); float nd, nd_tmp; Int i, in, cols, baris, terdekatpixel; // 1 2 3 // 0 i 4 // 7 6 5 // first pass: forward -> L->R, TB for (rows = 1; rows < height - 1; rows++) { for (cols = 1; cols < width - 1; cols++) { for (cols = 1; cols < width - 1; cols++) { i = rows * width + cols; nd = dis [i]; terdekatpixel = pos [i]; if (nd! = 0) {// lewati latar belakang piksel di = i; di += -1; // 0 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += -width; // 1 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += +1; // 2 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += +1; // 3 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } dis [i] = nd; POS [i] = terdekatpixel; }}} // Pass kedua: mundur-> r-> l, bt // persis sama dengan pass pertama, hanya dalam arah terbalik untuk (baris = tinggi-2; baris> = 1; baris--) {untuk (cols = lebar-2; cols> = 1; cols--) {i = baris * lebar + cols; nd = dis [i]; terdekatpixel = pos [i]; if (nd! = 0) {in = i; di += +1; // 4 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += +lebar; // 5 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += -1; // 6 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } di += -1; // 7 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; terdekatpixel = pos [in]; } dis [i] = nd; POS [i] = terdekatpixel; }}} untuk (int baris = 0; baris <tinggi; baris ++) {for (int col = 0; col <width; col ++) {index = baris * lebar+col; if (float.max_value! = dis [index]) {int grey = clamp ((int) (dis [index]))); inpixels [index] = (255 << 24) | (abu -abu << 16) | (abu -abu << 8) | abu-abu; }}} setRGB (dest, 0, 0, lebar, tinggi, inpixels); Return Dest; } private int clamp (int i) {return i> 255? 255: (i <0? 0: i); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.