Java基于直方图应用的相似图片识别实例

 更新时间:2014年09月25日 10:55:12   投稿:shichen2014  
这篇文章主要介绍了Java基于直方图应用的相似图片识别实例,是非常实用的技巧,多见于图形里游戏中,需要的朋友可以参考下

本文实例讲述了Java实现基于直方图应用的相似图片识别,是非常实用的技巧。分享给大家供大家参考。具体分析如下:

一、算法概述:

首先对源图像与要筛选的图像进行直方图数据采集,对采集的各自图像直方图进行归一化再使用巴氏系数算法对直方图数据进行计算,最终得出图像相似度值,其值范围在[0, 1]之间

0表示极其不同,1表示极其相似(相同)。

二、算法步骤详解:

大致可以分为两步,根据源图像与候选图像的像素数据,生成各自直方图数据。第二步:使用第一步输出的直方图结果,运用巴氏系数(Bhattacharyya coefficient)算法,计算出相似程度值。

第一步:直方图计算

直方图分为灰度直方图与RGB直方图,对于灰度图像直方图计算十分简单,只要初始化一个大小为256的直方图数组H,然后根据像素值完成频率分布统计,假设像素值为124,则H[124] += 1, 而对于彩色RGB像素来说直方图表达有两种方式,一种是单一直方图,另外一种是三维直方图,三维直方图比较简单明了,分别对应RGB三种颜色,定义三个直方图HR,HG, HB, 假设某一个像素点P的RGB值为(4, 231,129), 则对于的直方图计算为HR[4] += 1,HG[231] += 1, HB[129] += 1, 如此对每个像素点完成统计以后,RGB彩色直方图数据就生成了。

而RGB像素的单一直方图SH表示稍微复杂点,每个颜色的值范围为0 ~ 255之间的,假设可以分为一定范围等份,当8等份时,每个等份的值范围为32, 16等份时,每个等份值范围为16,当4等份时候,每个等份值的范围为64,假设RGB值为(14, 68, 221), 16等份之后,它对应直方图索引值(index)分别为: (0, 4, 13), 根据计算索引值公式:index = R + G*16 + B*16*16

对应的直方图index = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1

如此遍历所有RGB像素值,完成直方图数据计算。

第二步:巴氏系数计算,计算公式如下:

其中P, P'分别代表源与候选的图像直方图数据,对每个相同i的数据点乘积开平方以后相加

得出的结果即为图像相似度值(巴氏系数因子值),范围为0到1之间。

程序效果如下图所示:

相似度超过99%以上,极其相似

相似度为:72%, 一般相似

三、程序直方图计算源代码如下:

public void setGreenBinCount(int greenBinCount) { 
  this.greenBins = greenBinCount; 
} 
 
public void setBlueBinCount(int blueBinCount) { 
  this.blueBins = blueBinCount; 
} 
 
public float[] filter(BufferedImage src, BufferedImage dest) { 
  int width = src.getWidth(); 
    int height = src.getHeight(); 
     
    int[] inPixels = new int[width*height]; 
    float[] histogramData = new float[redBins * greenBins * blueBins]; 
    getRGB( src, 0, 0, width, height, inPixels ); 
    int index = 0; 
    int redIdx = 0, greenIdx = 0, blueIdx = 0; 
    int singleIndex = 0; 
    float total = 0; 
    for(int row=0; row<height; row++) { 
    int ta = 0, tr = 0, tg = 0, tb = 0; 
    for(int col=0; col<width; col++) { 
      index = row * width + col; 
      ta = (inPixels[index] >> 24) & 0xff; 
        tr = (inPixels[index] >> 16) & 0xff; 
        tg = (inPixels[index] >> 8) & 0xff; 
        tb = inPixels[index] & 0xff; 
        redIdx = (int)getBinIndex(redBins, tr, 255); 
        greenIdx = (int)getBinIndex(greenBins, tg, 255); 
        blueIdx = (int)getBinIndex(blueBins, tb, 255); 
        singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; 
        histogramData[singleIndex] += 1; 
        total += 1; 
    } 
    } 
     
    // start to normalize the histogram data 
    for (int i = 0; i < histogramData.length; i++) 
    { 
    histogramData[i] = histogramData[i] / total; 
    } 
     
    return histogramData; 
} 

计算巴氏系数的代码如下:

/** 
 * Bhattacharyya Coefficient 
 * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf 
 * 
 * @return 
 */ 
public double modelMatch() { 
  HistogramFilter hfilter = new HistogramFilter(); 
  float[] sourceData = hfilter.filter(sourceImage, null); 
  float[] candidateData = hfilter.filter(candidateImage, null); 
  double[] mixedData = new double[sourceData.length]; 
  for(int i=0; i<sourceData.length; i++ ) { 
    mixedData[i] = Math.sqrt(sourceData[i] * candidateData[i]); 
  } 
   
  // The values of Bhattacharyya Coefficient ranges from 0 to 1, 
  double similarity = 0; 
  for(int i=0; i<mixedData.length; i++ ) { 
    similarity += mixedData[i]; 
  } 
   
  // The degree of similarity 
  return similarity; 
}

希望本文所述对大家的Java程序设计有所帮助。

相关文章

  • java中枚举的详细使用介绍

    java中枚举的详细使用介绍

    本篇文章介绍了,在java中枚举的详细使用。需要的朋友参考下
    2013-04-04
  • Java中的Comparable和Comparator接口

    Java中的Comparable和Comparator接口

    这篇文章主要介绍了Java中的Comparable和Comparator接口,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 深入聊一聊springboot项目全局异常处理那些事儿

    深入聊一聊springboot项目全局异常处理那些事儿

    最近在做项目时需要对异常进行全局统一处理,所以下面这篇文章主要给大家介绍了关于springboot项目全局异常处理那些事儿,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • MyBatis中使用$和#所遇到的问题及解决办法

    MyBatis中使用$和#所遇到的问题及解决办法

    这篇文章主要介绍了MyBatis中使用$和#所遇到的问题及解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • 深入浅析Mybatis的缺陷问题

    深入浅析Mybatis的缺陷问题

    Mybatis是业界非常流行的持久层框架,轻量级、易用,在金融IT领域完全是领军地位,比Hibernate更受欢迎,优势非常多,也是非常值得我们学习的。这篇文章主要介绍了Mybatis的缺陷问题的相关资料,需要的朋友可以参考下
    2016-10-10
  • SpringCloud使用logback日志框架教程详解

    SpringCloud使用logback日志框架教程详解

    Logback是一个功能强大的日志框架,它是一个基于slf4j的日志系统,提供了可靠的日志服务,比log4j更快,更灵活,更容易使用。本文将教会你快速让你的项目集成logback日志框架,需要的朋友可以参考下
    2023-05-05
  • 详解Java如何给按钮添加监视器

    详解Java如何给按钮添加监视器

    这篇文章主要介绍了详解Java如何给按钮添加监视器,使用匿名对象、实现接口、实现类、Lambda表达式、注解等,需要的朋友可以参考下
    2023-04-04
  • Java中switch判断语句典型使用实例

    Java中switch判断语句典型使用实例

    这篇文章主要介绍了Java中switch判断语句典型使用实例,本文直接给出代码实例,在忘记switch语法时特别有用,复制修改即可使用,需要的朋友可以参考下
    2015-06-06
  • java 文件大数据Excel下载实例代码

    java 文件大数据Excel下载实例代码

    这篇文章主要介绍了java 文件大数据Excel下载实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java中 % 与Math.floorMod() 区别详解

    Java中 % 与Math.floorMod() 区别详解

    这篇文章主要介绍了Java中 % 与Math.floorMod() 区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论