java图像管理之倒角距离转换,获取图片指纹

java图像拍卖之倒角距离转换,java图像管理倒角

图像管理中的倒角距离转变(Chamfer Distance Transform)在对象相配识别中时时使用,算法基本上是依据3x3的窗口来扭转各个像素的离开值,分为两步成功距离转变,第一步从左上角初始,从左向右、从上到下移动窗口扫描每种像素,检查测量检验在大旨像素x的周边0、1、2、3多少个像素,保存最小距离与职责作为结果,图示如下:

图片 1

其次步从底向上、从右向左,对各类像素,检查实验相邻像素4、5、6、7保存最小距离与位置作为结果,如图示所:

图片 2

达成这两步以往,获得的结果输出即为倒角距离转变的结果。完整的图像倒角距离转变代码完结能够分成如下几步:

1.对像素数组开展初步化,全体背景颜色像素点最先距离为无穷大,前景像素点距离为0

2.最早倒角距离转变中的第一步,并保留结果

3.基于第一步结果做到倒角距离转变中的第二步

4.基于距离转换结果展现全体不一样灰度值,造成图像

末尾结果展现如下(左侧表示原图、左侧表示CDT之后结果)

图片 3

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

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 < 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, rows, nearestPixel; 

    // 1 2 3 
    // 0 i 4 
    // 7 6 5 
    // first pass: forward -> L->R, T-B 
    for (rows = 1; rows < height - 1; rows++) { 
      for (cols = 1; cols < width - 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 = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          in += -width; // 1 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          in += +1; // 2 
          if ((nd_tmp = d1 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          in += +1; // 3 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            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 = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          in += +width; // 5 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          in += -1; // 6 
          if ((nd_tmp = d1 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          in += -1; // 7 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 

          dis[i] = nd; 
          pos[i] = nearestPixel; 

        } 
      } 
    } 

    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 gray = clamp((int) (dis[index])); 
          inPixels[index] = (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); 
  } 

} 

上述就是本文的全部内容,希望对我们的求学抱有利于,也期望咱们多多指教帮客之家。

图像管理中的倒角距离转换(Chamfer Distance Transform)在目的相配识别中常常使用,算法基本上是...

atitit.图片相似度与图片检索的设计.

 

1. 两张图纸相似算法 1

2. DCT(离散余弦调换(DiscreteCosineTransform))编辑 2

3.  编写制定距离编辑 3

4. Java数字图像处理基础知识 - 必读 3

5. 汉明距离  4

5.1. 目录 4

5.2. 1介绍 5

6. Attilax框架完成5

6.1. 赢得图片指纹 5

6.2. 到手图像不相似度 6

7. 参考 6

 

 

 

1. 两张图片相似算法

,原理极其轻巧易懂。大家得以用多个快捷算法,就达到基本的作用。

此间的关键技艺叫做"感知哈希算法"(Perceptual hash algorithm),它的遵从是对每张图纸生成一个"指纹"(fingerprint)字符串,然后相比区别图片的指印。结果越临近,就表明图片越相似。

上面是叁个最简便易行的贯彻:

 

 

我:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519849@qq.com

转发请注解来源: 

 

第一步,缩短尺寸。

将图片降低到8x8的尺寸,总共陆十三个像素。这一步的成效是去除图片的内部情形,只保留结构、明暗等为主音信,丢掉差别尺寸、比例带来的图片出入。

 

其次步,简化色彩。

将压缩后的图形,转为64级灰度。也正是说,全部像素点总共唯有64种颜色。

其三步,总计平均值。

计量有所63个像素的灰度平均值。

第四步,比较像素的灰度。

将各种像素的灰度,与平均值进行相比较。大于或等于平均值,记为1;小于平均值,记为0。

第五步,总结哈希值。

将上一步的可比结实,组合在共同,就构成了多少个六15个人的莫西干发型,那正是那张图片的指印。组合的顺序并不根本,只要保险具有图片都选取同贰次序就行了。

 =  = 8f373714acfcf4d0

获得指纹今后,就足以对照分裂的图样,看看六十三位中有个别许位是区别的。在理论上,那同一总括"汉明距离"(Hamming distance)。假诺不平等的数据位不超越5,就印证两张图片很相像;假设超越10,就认证那是两张分化的图片。

切切实实的代码达成,能够参见Wote用python语言写的imgHash.py。代码不够长,唯有53行。使用的时候,第一个参数是标准化图片,第二个参数是用来相比的别的图片所在的目录,重返结果是两张图片之间不均等的数额位数量(汉明距离)。

这种算法的优点是简约便捷,不受图片大小缩放的震慑,劣势是图表的原委不能够改变。要是在图纸上加多少个文字,它就认不出来了。所以,它的一流用途是基于缩略图,搜索原图。

实际行使中,往往使用更加强劲的pHash算法和SIFT算法,它们能够分辨图片的变形。只要变形程度不超过五分三,它们就能够相配原图。那些算法固然更目眩神摇,可是原理与地点的便利算法是一样的,即是先将图纸转化成Hash字符串,然后再张开比较。

上边咱们来看下上述辩护用java来做五个DEMO版的切切实实贯彻:

 

 

 

2. DCT(离散余弦转换(DiscreteCosineTransform))编辑

离散余弦转换(Discrete Cosine Transform,简称DCT转变)是一种与傅立叶调换紧凑相关的数学生运动算。在傅立叶级数打开式中,借使被进行的函数是实偶函数,那么其傅立叶级数中只包涵余弦项,再将其离散化可导出余弦转换,由此称为离散余弦转变

离散余弦调换(Discrete Cosine Transform)

离散余弦转变(DCT)是N.Ahmed等人在一九七二年提议的正交调换情势。它常被感觉是对语音和图像频限信号进行变

iDCT

换的一级方法。为了工程上贯彻的内需,本国外大多大方耗费了十分的大精力去寻找或创新离散余弦调换的立时算法。由于近来数字复信号管理芯片(DSP)的发展,加上专项使用集成都电子通信工程高校路设计上的优势,那就稳定地确立离散余弦转换(DCT)在目前图像编码中的首要地位,成为H.261、JPEG、MPEG, H.264 等国际上公用的编码标准的首要环节。在录制压缩中,最常用的调换情势正是DCT。它被以为是性质类似K-L变换的准最棒调换,其调换编码的

 

3.  编写制定距离编辑

本词条缺乏名片图,补充有关内容使词条更完整,还是能够急速升高,赶紧来编排吧!

编辑距离(Edit Distance),又称Levenshtein距离,是指八个字串之间,由一个转成另一个所需的起码编辑操作次数。许可的编纂操作包含将贰个字符替换来另三个字符,插入三个字符,删除三个字符。

举个例子将kitten一字转成sitting:

sitten (k→s)

sittin (e→i)

sitting (→g)

俄罗丝化学家Vladimir Levenshtein在一九六七年提议这些概念。

 

4. Java数字图像管理基础知识 - 必读

分类: 图像管理2012-02-21 15:11 19916人阅读 评论(4) 收藏 举报

图像管理javaimagefilejcomponentapi

写了累累篇关于图像管理的稿子,未有一篇介绍Java 2D的图像管理API,小说探讨和聊到的

API都是依靠JDK6的,首先来看Java中什么组织贰个图像对象BufferedImage的,如图:

二个BufferedImage的像素数量积攒在Raster中,ColorModel里面积攒颜色空间,类型等

新闻,当前Java只协理一下三种图像格式- JPG,PNG,GIF,怎样向让Java补助任何格式,首

先要 实现Java中的图像读写接口,然后打成jar,加上运转参数- Xbootclasspath/p

newimageformatIO.jar即可。

 

 

5. 汉明距离 

锁定

本词条由“科学普及中中原人民共和国”百科科学词条编写制定与运用工作项目审核。

汉明距离是利用在数据传输差错调整编码里面包车型地铁,汉明距离是八个定义,它表示八个(同样长度)字对应位分裂的多少,大家以d(x,y)表示两个字x,y之间的汉明距离。对三个字符串举行异或运算,并计算结果为1的个数,那么那个数便是汉明距离。

5.1. 目录

1介绍

2汉明重量

3特性

4细微汉明距离

5正史及使用

5.2. 1介绍

汉明距离是以Richard·卫斯里·汉明的名字命名的。在消息论中,多少个等长字符串之间的汉明距离是八个字符串对应地点的不如字符的个数。换句话说,它正是将一个字符串转变到别的三个字符串所急需替换的字符个数。比如:

1011101 与 1001001 之间的汉明距离是 2。

2143896 与 2233796 之间的汉明距离是 3。

"toned" 与 "roses" 之间的汉明距离是 3。

 

 

汉明距离更加多的用来非时域信号管理,表宾博(Aptamil)个信号成为另贰个连续信号要求的微小操作(替换个地方),实际中正是相比较七个比特串有个别许个位不平等,简洁的操作时正是五个比特串举办异或之后包罗1的个数。汉明距在图像管理领域也可以有那广泛的应用,是相比较二进制图像很实惠的一手。总计二个数字的比特位包括1的个数有个小本领:value &= value - 1那么些运算的结果便是把value最终四个1去掉,循环举行演算直到value等于0(全体的1都被去掉)就能够清楚vaule具有多少个1了。其在包涵消息论、编码理论、密码学等领域都有使用。可是,假使要比较五个例外交参谋长短的字符串,不止要进行轮换,何况要举办扦插与删除的演算,在这种场面下,平日选用特别目不暇接的编辑撰写距离等算法。

 

 

6. Attilax框架达成

Atibrow prj  ImagePHash.java

6.1. 收获图片指纹

  final ImagePHash p = new ImagePHash();

   final String image1      = p.getHash(new FileInputStream(new File("d:/img/a2.jpg")));

 

6.2. 拿走图像不相似度

   final String image1      = p.getHash(new FileInputStream(new File("d:/img/a2.jpg")));

           dirx.trave("D:\gialenimg", new Closure () {

 

@Override

public Object execute(Object arg0) throws Exception {

String f=(String) arg0;

  image2 = p.getHash(new FileInputStream(new File(f)));

  int dis=p.distance(image1, image2);

  if(dis<474)

 

 

7. 参考

Java完毕图片相比功用_java_剧本之家.html

Java数字图像管理基础知识 - 必读 - 流浪的鱼 - 博客频道 - CSDN.NET.html

Java图片上探究图片算法 - qileilove - BlogJava.html

 

(with code)用汉明距离举行图片相似度检查测量试验的Java完成 - OPEN 开拓经历库.html

貌似图片检索的法规 - OPEN资讯.html

 

本文由华夏彩票发布于计算机网络,转载请注明出处:java图像管理之倒角距离转换,获取图片指纹

您可能还会对下面的文章感兴趣: