Преобразование расстояния в шате в обработке изображений часто используется при распознавании соответствия объектов. Алгоритм в основном генерирует значение расстояния каждого пикселя на основе окна 3x3 и делится на два шага для завершения преобразования расстояния. Первый шаг начинается с верхнего левого угла, сканирует каждый пиксель слева вправо, сверху до нижней части и обнаруживает четыре пикселя вокруг центрального пикселя X и сохраняет минимальное расстояние и положение в качестве результата. Фигура выглядит следующим образом:
Второй шаг состоит в том, чтобы обнаружить минимальное расстояние и положение соседних пикселей 4, 5, 6, 7 снизу справа влево, в результате, для каждого пикселя:
После завершения этих двух этапов результат вывода является результатом преобразования расстояния фачики. Полная реализация кода преобразования расстояния с изображением может быть разделена на следующие шаги:
1. Инициализируйте массив пикселей, начальное расстояние всех пикселей фонового цвета бесконечно, а расстояние пикселей переднего плана составляет 0.
2. Начните первый шаг в преобразовании расстояния пасы и сохраните результат
3. Завершите второй шаг в преобразовании расстояния шаты на основе результатов первого шага
4. Отображение всех различных значений серого в соответствии с результатами преобразования расстояния, чтобы сформировать изображение
Окончательный результат отображается следующим образом (влево указывает исходное изображение, а вправо указывает результат после CDT)
Исходный код для полного преобразования расстояния расстояния двоичного изображения выглядит следующим образом:
пакет com.gloomyfish.image.transform; импортировать java.awt.color; Импорт java.awt.image.bufferedImage; импортировать java.util.arrays; Import com.gloomyfish.filter.study.abstractbufferedImageop; открытый класс cdtfilter расширяет AbstractBufferedImageop {private float [] dis; // nn-distances private int [] pos; // nn-положения, 32-битный индекс частного цвета Bakcgroundcolor; public cdtfilter (color bgcolor) {this.bakcgroundcolor = bgcolor; } @Override public BufferedImage Filter (BufferedImage SRC, BufferedImage dest) {int width = src.getwidth (); int height = src.getheight (); if (dest == null) dest = createCompatiBodEStimage (src, null); int [] inpixels = new int [ширина * высота]; pos = new int [ширина * высота]; dis = новый поплавок [ширина * высота]; src.getrgb (0, 0, ширина, высота, инстиксели, 0, ширина); // случайно сгенерированная точка преобразования расстояния int index = 0; Arrays.fill (dis, float.max_value); int numoffc = 0; for (int row = 0; row <height; row ++) {for (int col = 0; col <width; col ++) {index = row * width+col; if (inpixels [index]! = bakcgroundcolor.getrgb ()) {dis [index] = 0; pos [index] = index; numoffc ++; }}} final float d1 = 1; Final Float D2 = (float) math.sqrt (d1 * d1 + d1 * d1); System.out.println (numoffc); float nd, nd_tmp; int i, in, cols, ряд, ближайший кервик; // 1 2 3 // 0 I 4 // 7 6 5 // Первый проход: вперед -> l-> r, tb для (Rows = 1; Rows <Высота - 1; Роуд ++) {для (Cols = 1; Cols <Width - 1; Cols ++) {for (cols = 1; Cols <width - 1; cols ++) {i = rows * width+cols; nd = dis [i]; alsestpixel = pos [i]; if (nd! = 0) {// пропустить фоновые пиксели в = i; в += -1; // 0 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } in += -width; // 1 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += +1; // 2 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += +1; // 3 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } dis [i] = nd; pos [i] = ближайший кепль; }}} // Second Pass: назад-> r-> l, bt // точно такой же, как первый проход, просто в обратном направлении для (Rows = высота-2; Rows> = 1; Rows--) {for (cols = width-2; cols> = 1; cols--) {i = Rows * width + cols; nd = dis [i]; alsestpixel = pos [i]; if (nd! = 0) {in = i; в += +1; // 4 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += +ширина; // 5 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += -1; // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += -1; // 6 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } в += -1; // 7 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; stosestpixel = pos [in]; } dis [i] = nd; pos [i] = ближайший кепль; }}} for (int row = 0; row <height; row ++) {for (int col = 0; col <width; col ++) {index = row * width+col; if (float.max_value! = dis [index]) {int grey = clamp ((int) (dis [index])); inpixels [index] = (255 << 24) | (серый << 16) | (серый << 8) | серый; }}} setrgb (dest, 0, 0, ширина, высота, инстиксель); вернуть Дест; } private int clamp (int i) {return i> 255? 255: (я <0? 0: i); }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.