图像处理之相似图片识别(直方图应用篇)

算法概述:

首先对源图像与要筛选的图像进行直方图数据采集,对采集的各自图像直方图进行归一化再

使用巴氏系数算法对直方图数据进行计算,最终得出图像相似度值,其值范围在[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 datafor (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 similarityreturn similarity;}

转载文章请务必注明出自本博客

图像处理之相似图片识别(直方图应用篇)相关推荐

  1. 「硬见小百科」电子元器件图片识别(电容篇)

    来源:电子电路 --END-- 关于硬见科技 硬见科技是国内最具特色的电子工程师社区,融合了行业资讯.社群互动.培训学习.活动交流.设计与制造分包等服务,以开放式硬件创新技术交流和培训服务为核心,连接 ...

  2. c# imager让图片有圆角unity_C# 10分钟完成百度图片提取文字(文字识别)——入门篇...

    现在图片文字识别已经很成熟了,比如qq长按图片,点击图片识别就可以识别图片的文字,将不认识的.文字数量大的.或者不能赋值的值进行二次可复制功能. 我们现在就基于百度Ai开放平台进行个人文字识别,dem ...

  3. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别...

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  4. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇二:基于OneNote难点突破和批量识别

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  5. python 识图点击_Python图片识别——人工智能篇

    一.安装pytesseract和PIL PIL全称:Python Imaging Library,python图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力. 由于PIL仅支 ...

  6. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结...

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  7. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  8. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

  9. Python图片识别——人工智能篇

    目录  一.安装pytesseract和PIL PIL全称:Python Imaging Library,python图像处理库,这个库支持多种文件格式,并提供了强大的图像处理和图形处理能力. 由于P ...

  10. 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇四:关于OneNote入库处理以及审核...

    篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...

最新文章

  1. 开源项目贡献者_如何吸引新的贡献者加入您的开源项目
  2. Office 365系列之十:批量部署O365客户端
  3. 【软件构造】第三章第三节 抽象数据型(ADT)
  4. BACKUP PENDING状态的解除
  5. selenium java 滚动条_java+selenium使用JS、键盘滑动滚动条
  6. android学习者优秀网址推荐
  7. 正则不能输入特殊字符_正则表达式语法学习和在线练习
  8. flutter字体不跟随系统_Flutter自定义字体无法加载
  9. java所参数查询_Java程序查询系统参数
  10. Bailian2796 Bailian3681 数字求和【入门】
  11. JS引擎线程的执行过程的三个阶段(二)
  12. TCP header
  13. 【优化电价】基于matlab内点法求解实时电价最优问题【含Matlab源码 1161期】
  14. LinuxDNS域名解析
  15. DEV01-GBase 8a MPP Cluster SQL 编码进阶篇
  16. 北理工乐学C语言 60.合并排序
  17. Oracle ASM存储Spfile解析
  18. Python:max函数获取列表最大值
  19. 相机光学(二十)——三原色与白平衡
  20. 隐私计算及密码学学习记录

热门文章

  1. 数字方法--按零补位
  2. ubuntu系统下CodeLite与opencv配置
  3. Android 9 低内存应用程序保活
  4. 1034 有理数四则运算
  5. [附源码]计算机毕业设计JAVAjsp教学辅助系统
  6. CSS(层叠样式表(Cascading Style Sheets))历史
  7. php if相关标签,dedecms模板中运用dede标签时使用php和if判断语句的方法
  8. qtableview点击行将整行数据传过去_三部评分达到九分以上的电视剧,琅琊榜甄嬛传在列...
  9. 餐厅点菜c语言程序代码,餐馆点菜系统C语言源代码.pdf
  10. python:输出10行的杨辉三角 - 二项式的n次方展开系数