La transformación de distancia del chaflán en el procesamiento de imágenes a menudo se usa en el reconocimiento de coincidencia de objetos. El algoritmo básicamente genera el valor de distancia de cada píxel basado en una ventana 3x3, y se divide en dos pasos para completar la transformación de distancia. El primer paso comienza desde la esquina superior izquierda, escanea cada píxel de izquierda a derecha, de arriba a abajo, y detecta cuatro píxeles alrededor del píxel del centro X, y guarda la distancia y la posición mínima como resultado. La figura es la siguiente:
El segundo paso es detectar la distancia mínima y la posición de los píxeles adyacentes 4, 5, 6, 7 de abajo a la derecha a la izquierda, como resultado, para cada píxel:
Después de completar estos dos pasos, la salida del resultado es el resultado de la transformación de distancia del chaflán. La implementación completa del código de transformación de distancia de la distancia de la imagen se puede dividir en los siguientes pasos:
1. Inicializar la matriz de píxeles, la distancia inicial de todos los píxeles de color de fondo es infinita, y la distancia de los píxeles de primer plano es 0.
2. Comience el primer paso en la transformación de la distancia del chaflán y guarde el resultado
3. Complete el segundo paso en la transformación de la distancia del chaflán basada en los resultados del primer paso
4. Muestre todos los diferentes valores de escala de grises de acuerdo con los resultados de la transformación de distancia para formar una imagen
El resultado final se muestra de la siguiente manera (la izquierda indica la imagen original y la derecha indica el resultado después de CDT)
El código fuente para la transformación completa de la distancia del chaflán de imagen binaria es el siguiente:
paquete com.gloomyfish.image.transform; import java.awt.color; import java.awt.image.bufferedImage; importar java.util.arrays; import com.gloomyfish.filter.study.AbstractbufferedImageOp; clase pública cdtfilter extiende abstractbufferedImageop {private float [] dis; // nn-Distances private int [] pos; // posiciones nn, índice de 32 bits de color privado bakcgroundcolor; Public cdtfilter (color bgcolor) {this.bakcgroundcolor = bgcolor; } @Override Public BufferedImage Filter (BufferedImage Src, BufferedImage Dest) {int width = src.getWidth (); int hight = src.getheight (); if (dest == null) dest = createCompatibleDeStimage (src, null); int [] inpixels = new int [width * altura]; pos = nuevo int [ancho * altura]; dis = nuevo flotador [ancho * altura]; src.getrgb (0, 0, ancho, altura, inpíxeles, 0, ancho); // punto de transformación de distancia generado aleatoriamente int index = 0; Arrays.fill (dis, float.max_value); int nmoffc = 0; for (int row = 0; fila <hight; row ++) {for (int col = 0; col <width; col ++) {index = row * width+col; if (inpixels [index]! = Bakcgroundcolor.getRgb ()) {dis [index] = 0; pos [index] = índice; NUMOFFC ++; }}} Flotador final d1 = 1; FLOAT FINAL D2 = (FLOAT) MATH.SQRT (D1 * D1 + D1 * D1); System.out.println (namoffc); flotante nd, nd_tmp; int i, in, cols, filas, más cercano píxel; // 1 2 3 // 0 I 4 // 7 6 5 // Primer pase: hacia adelante -> l-> r, tb para (filas = 1; filas <altura - 1; filas ++) {for (cols = 1; cols <width - 1; cols ++) {para (cols = 1; cols <width - 1; cols ++) {i = rows * COLS; nd = dis [i]; más cercanopixel = pos [i]; if (nd! = 0) {// omita los píxeles de fondo en = i; en += -1; // 0 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += -width; // 1 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += +1; // 2 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += +1; // 3 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } dis [i] = nd; pos [i] = más cercanopixel; }}} // segundo pase: hacia atrás-> r-> l, bt // exactamente igual que el primer paso, solo en la dirección inversa para (filas = altura-2; filas> = 1; filas--) {para (cols = ancho-2; cols> = 1; cols--) {i = filas * ancho + cols; nd = dis [i]; más cercanopixel = pos [i]; if (nd! = 0) {in = i; en += +1; // 4 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } en += +ancho; // 5 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += -1; // 6 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } in += -1; // 7 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; más cercanopixel = pos [in]; } dis [i] = nd; pos [i] = más cercanopixel; }}} para (int row = 0; fila <altura; fila ++) {for (int col = 0; col <width; col ++) {index = row * width+col; if (float.max_value! = dis [index]) {int gris = clamp ((int) (dis [index])); inpixels [index] = (255 << 24) | (gris << 16) | (gris << 8) | gris; }}} setrgb (dest, 0, 0, ancho, altura, inpixels); regresar des; } private int clamp (int i) {return i> 255? 255: (i <0? 0: i); }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.