La transformation de la distance de chanfrein dans le traitement d'image est souvent utilisée dans la reconnaissance de correspondance d'objets. L'algorithme génère essentiellement la valeur de distance de chaque pixel basé sur une fenêtre 3x3 et est divisé en deux étapes pour terminer la transformation de distance. La première étape commence du coin supérieur gauche, scanne chaque pixel de la gauche à droite, de haut en bas, et détecte quatre pixels autour du pixel central X, et enregistre la distance et la position minimales comme le résultat. La figure est la suivante:
La deuxième étape consiste à détecter la distance et la position minimales des pixels adjacents 4, 5, 6, 7 du bas vers la droite à gauche, en conséquence, pour chaque pixel:
Après avoir terminé ces deux étapes, la sortie du résultat est le résultat de la transformation de la distance de chanfrein. L'implémentation complète du code de transformation de distance du chanfrein d'image peut être divisée en étapes suivantes:
1. Initialiser le réseau de pixels, la distance initiale de tous les pixels de couleur d'arrière-plan est infinie et la distance des pixels de premier plan est de 0.
2. Démarrez la première étape de la transformation de la distance de chanfrein et enregistrez le résultat
3. Complétez la deuxième étape de la transformation de la distance de chanfrein en fonction des résultats de la première étape
4. Afficher toutes les différentes valeurs de niveaux de gris en fonction des résultats de la transformation de distance pour former une image
Le résultat final est affiché comme suit (la gauche indique l'image d'origine et la droite indique le résultat après CDT)
Le code source de la transformation complète de la distance de chanfrein d'image binaire est le suivant:
package com.gloomyfish.image.transform; import java.awt.color; Importer java.awt.image.bufferedImage; import java.util.arrays; import com.gloomyfish.filter.study.abstractBufferedImageOP; La classe publique CDTFilter étend AbstractBufferedImageOP {Private Float [] dis; // nn-distances private int [] pos; // Positions nn, index 32 bits Color BakcgroundColor; public cdtfilter (couleur bgColor) {this.bakcgroundcolor = bgcolor; } @Override Public BufferedImage Filter (BufferedImage Src, BufferedImage dest) {int width = src.getWidth (); int height = src.GetHeight (); if (dest == null) dest = createCompatibledStimage (src, null); int [] inpixels = new int [width * hauteur]; pos = new int [largeur * hauteur]; dis = nouveau flotteur [largeur * hauteur]; src.getrgb (0, 0, largeur, hauteur, inpixels, 0, largeur); // point de transformation de distance généré au hasard int index = 0; Arrays.fill (dis, float.max_value); int numoffc = 0; for (int row = 0; row <hight; row ++) {for (int col = 0; col <width; col ++) {index = row * width + col; if (inpixels [index]! = bakcgroundcolor.getrgb ()) {dis [index] = 0; pos [index] = index; Nuloffc ++; }}} float final d1 = 1; float final d2 = (float) math.sqrt (d1 * d1 + d1 * d1); System.out.println (Nuloffc); float nd, nd_tmp; int i, in, cols, lignes, warmpixel le plus proche; // 1 2 3 // 0 i 4 // 7 6 5 // Première passe: avant -> l-> r, tb pour (lignes = 1; lignes <height - 1; lignes ++) {for (cols = 1; cols <width - 1; cols ++) {for (cols = 1; cols <width - 1; cols ++) {i = rows * width + cols; nd = dis [i]; la plus la plus proche = pos [i]; if (nd! = 0) {// sauter des pixels d'arrière-plan dans = i; dans + = -1; // 0 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = -Width; // 1 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = +1; // 2 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = +1; // 3 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dis [i] = nd; pos [i] = le plus fier-épixel; }}} // Deuxième passe: vers l'arrière -> r-> l, bt // exactement comme la première passe, juste dans le sens inverse pour (lignes = hauteur - 2; lignes> = 1; lignes--) {pour (cols = largeur - 2; cols> = 1; cols--) {i = lignes * largeur + cols; nd = dis [i]; la plus la plus proche = pos [i]; if (nd! = 0) {in = i; dans + = +1; // 4 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = + largeur; // 5 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = -1; // 6 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dans + = -1; // 7 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; la plus la plus proche = pos [in]; } dis [i] = nd; pos [i] = le plus fier-épixel; }}} pour (int row = 0; row <height; row ++) {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) | (Gray << 16) | (gris << 8) | gris; }}} setrgb (dest, 0, 0, largeur, hauteur, inpixels); retour dest; } private int clamp (int i) {return i> 255? 255: (i <0? 0: i); }}Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.