A transformação da distância de chanfro no processamento da imagem é frequentemente usada no reconhecimento de correspondência de objetos. O algoritmo gera basicamente o valor da distância de cada pixel com base em uma janela 3x3 e é dividido em duas etapas para concluir a transformação da distância. A primeira etapa começa no canto superior esquerdo, digitaliza cada pixel da esquerda para a direita, de cima para baixo, e detecta quatro pixels ao redor do pixel central X e salva a distância e a posição mínimas como resultado. A figura é a seguinte:
O segundo passo é detectar a distância e a posição mínima dos pixels 4, 5, 6, 7 adjacentes de baixo para a direita à esquerda, como resultado, para cada pixel:
Depois de concluir essas duas etapas, a saída do resultado é o resultado da transformação da distância de chanfro. A implementação completa do código de transformação da distância chanfal de imagem pode ser dividida nas etapas a seguir:
1. Inicialize a matriz de pixels, a distância inicial de todos os pixels de cor de fundo é infinita e a distância dos pixels de primeiro plano é 0.
2. Inicie a primeira etapa na transformação da distância de chanfro e salve o resultado
3. Complete o segundo passo na transformação da distância de chanfro com base nos resultados da primeira etapa
4. Exiba todos os valores de escala de cinza diferentes de acordo com os resultados da transformação da distância para formar uma imagem
O resultado final é exibido da seguinte forma (a esquerda indica a imagem original e a direita indica o resultado após o CDT)
O código -fonte para a transformação completa da distância de chanfro de imagem binária é a seguinte:
pacote com.gloomyfish.image.transform; importar java.awt.color; importar java.awt.image.bufferiMage; importar java.util.arrays; importação com.gloomyfish.filter.study.abstractBufferImageOp; classe pública CDTFilter estende abstrataBufferImageOp {private float [] dis; // nn-distances private int [] pos; // nn-posições, índice de 32 bits de cor privado bakcgroundColor; public CDTFilter (color bgColor) {this.BakCgroundColor = bgcolor; } @Override public bufferImage filtro (bufferImage src, bufferiMage dest) {int width = src.getwidth (); int height = src.getHeight (); if (dest == null) dest = createCompatiBledestImage (src, nulo); int [] inpixels = new int [largura * altura]; pos = new int [largura * altura]; DIS = novo float [largura * altura]; src.getRgb (0, 0, largura, altura, inpixels, 0, largura); // Ponto de transformação de distância gerado aleatoriamente INDEX INT = 0; Arrays.Fill (DIS, Float.max_value); int noroffc = 0; for (int linha = 0; linha <altura; linha ++) {for (int col = 0; col <width; col ++) {index = linha * largura+col; if (inpixels [index]! = bakcgroundColor.getRgb ()) {Dis [index] = 0; POS [índice] = index; NUMOFFC ++; }}} flutuação final d1 = 1; FLOAT FINAL D2 = (FLOAT) MATH.SQRT (D1 * D1 + D1 * D1); System.out.println (numeOffc); flutuar nd, nd_tmp; int i, em, cols, linhas, mais próximo; // 1 2 3 // 0 i 4 // 7 6 5 // Primeira passagem: avanço -> l-> r, tb for (linhas = 1; linhas <altura - 1; linhas ++) {for (cols = 1; cols <width - 1; cols ++) {para (cols = 1; cols <width - 1; nd = dis [i]; mais próximopixel = pos [i]; if (nd! = 0) {// pula pixels de fundo em = i; em += -1; // 0 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += -width; // 1 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += +1; // 2 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += +1; // 3 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } dis [i] = nd; POS [i] = mais próximo de Pixel; }}} // Segunda passagem: para trás-> r-> l, bt // exatamente o mesmo que o primeiro passe, exatamente na direção inversa para (linhas = altura-2; linhas> = 1; linhas--) {for (cols = width-2; cols> = 1; cols-) {i = linhas * width + cols; nd = dis [i]; mais próximopixel = pos [i]; if (nd! = 0) {in = i; em += +1; // 4 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += +largura; // 5 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += -1; // 6 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } em += -1; // 7 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; mais próximoPixel = POS [in]; } dis [i] = nd; POS [i] = mais próximo de Pixel; }}} para (int linha = 0; linha <altura; linha ++) {for (int col = 0; col <width; col ++) {index = line largura * width+col; if (float.max_value! = DIS [index]) {int Gray = CLAMP ((int) (dis [index])); inpixels [index] = (255 << 24) | (cinza << 16) | (cinza << 8) | cinza; }}} setRgb (dest, 0, 0, largura, altura, inpixels); retorno dest; } private int CLAMP (int i) {return i> 255? 255: (i <0? 0: i); }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.