热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java图像识别出距离_java图像处理之倒角距离变换

图像处理中的倒角距离变换(ChamferDistanceTransform)在对象匹配识别中经常用到,算法基本上是基于3x3的窗口来生成每个像素的距离值,

图像处理中的倒角距离变换(Chamfer Distance Transform)在对象匹配识别中经常用到,算法基本上是基于3x3的窗口来生成每个像素的距离值,分为两步完成距离变换,第一步从左上角开始,从左向右、从上到下移动窗口扫描每个像素,检测在中心像素x的周围0、1、2、3四个像素,保存最小距离与位置作为结果,图示如下:

4125d6163cf748e49e65af6e0f13b86a.png

第二步从底向上、从右向左,对每个像素,检测相邻像素4、5、6、7保存最小距离与位置作为结果,如图示所:

7001d9b0851d0b06127ad8f2491d8824.png

完成这两步以后,得到的结果输出即为倒角距离变换的结果。完整的图像倒角距离变换代码实现可以分为如下几步:

1.对像素数组进行初始化,所有背景颜色像素点初始距离为无穷大,前景像素点距离为0

2.开始倒角距离变换中的第一步,并保存结果

3.基于第一步结果完成倒角距离变换中的第二步

4.根据距离变换结果显示所有不同灰度值,形成图像

最终结果显示如下(左边表示原图、右边表示CDT之后结果)

10d2d2398d651753a2388cac6e8172b2.png

完整的二值图像倒角距离变换的源代码如下:

package com.gloomyfish.image.transform;

import java.awt.Color;

import java.awt.image.BufferedImage;

import java.util.Arrays;

import com.gloomyfish.filter.study.AbstractBufferedImageOp;

public class CDTFilter extends AbstractBufferedImageOp {

private float[] dis; // nn-distances

private int[] pos; // nn-positions, 32 bit index

private Color 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 = createCompatibleDestImage(src, null);

int[] inPixels = new int[width * height];

pos = new int[width * height];

dis = new float[width * height];

src.getRGB(0, 0, width, height, inPixels, 0, width);

// 随机生成距离变换点

int index = 0;

Arrays.fill(dis, Float.MAX_VALUE);

int numOfFC = 0;

for (int row = 0; row

for (int col = 0; 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, rows, nearestPixel;

// 1 2 3

// 0 i 4

// 7 6 5

// first pass: forward -> L->R, T-B

for (rows = 1; rows

for (cols = 1; cols

i = rows * width + cols;

nd = dis[i];

nearestPixel = pos[i];

if (nd != 0) { // skip background pixels

in = i;

in += -1; // 0

if ((nd_tmp = d1 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

in += -width; // 1

if ((nd_tmp = d2 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

in += +1; // 2

if ((nd_tmp = d1 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

in += +1; // 3

if ((nd_tmp = d2 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

dis[i] = nd;

pos[i] = nearestPixel;

}

}

}

// second pass: backwards -> R->L, B-T

// exactly same as first pass, just in the reverse direction

for (rows = height - 2; rows >= 1; rows--) {

for (cols = width - 2; cols >= 1; cols--) {

i = rows * width + cols;

nd = dis[i];

nearestPixel = pos[i];

if (nd != 0) {

in = i;

in += +1; // 4

if ((nd_tmp = d1 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

in += +width; // 5

if ((nd_tmp = d2 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

in += -1; // 6

if ((nd_tmp = d1 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

in += -1; // 7

if ((nd_tmp = d2 + dis[in])

nd = nd_tmp;

nearestPixel = pos[in];

}

dis[i] = nd;

pos[i] = nearestPixel;

}

}

}

for (int row = 0; row

for (int col = 0; col

index = row * width + col;

if (Float.MAX_VALUE != dis[index]) {

int gray = clamp((int) (dis[index]));

inPixels[index] &#61; (255 <<24) | (gray <<16) | (gray <<8)

| gray;

}

}

}

setRGB(dest, 0, 0, width, height, inPixels);

return dest;

}

private int clamp(int i) {

return i > 255 ? 255 : (i <0 ? 0 : i);

}

}

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持脚本之家。



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
author-avatar
笑眯眯马甲61
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有