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

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><strong>算法概述:</strong></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-heig

算法概述:

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

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

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

[java]  view plain copy
  1. public void setGreenBinCount(int greenBinCount) {  
  2.     this.greenBins = greenBinCount;  
  3. }  
  4.   
  5. public void setBlueBinCount(int blueBinCount) {  
  6.     this.blueBins = blueBinCount;  
  7. }  
  8.   
  9. public float[] filter(BufferedImage src, BufferedImage dest) {  
  10.     int width = src.getWidth();  
  11.        int height = src.getHeight();  
  12.          
  13.        int[] inPixels = new int[width*height];  
  14.        float[] histogramData = new float[redBins * greenBins * blueBins];  
  15.        getRGB( src, 00, width, height, inPixels );  
  16.        int index = 0;  
  17.        int redIdx = 0, greenIdx = 0, blueIdx = 0;  
  18.        int singleIndex = 0;  
  19.        float total = 0;  
  20.        for(int row=0; row<height; row++) {  
  21.         int ta = 0, tr = 0, tg = 0, tb = 0;  
  22.         for(int col=0; col<width; col++) {  
  23.             index = row * width + col;  
  24.             ta = (inPixels[index] >> 24) & 0xff;  
  25.                tr = (inPixels[index] >> 16) & 0xff;  
  26.                tg = (inPixels[index] >> 8) & 0xff;  
  27.                tb = inPixels[index] & 0xff;  
  28.                redIdx = (int)getBinIndex(redBins, tr, 255);  
  29.                greenIdx = (int)getBinIndex(greenBins, tg, 255);  
  30.                blueIdx = (int)getBinIndex(blueBins, tb, 255);  
  31.                singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins;  
  32.                histogramData[singleIndex] += 1;  
  33.                total += 1;  
  34.         }  
  35.        }  
  36.          
  37.        // start to normalize the histogram data  
  38.        for (int i = 0; i < histogramData.length; i++)  
  39.        {  
  40.         histogramData[i] = histogramData[i] / total;  
  41.        }  
  42.          
  43.        return histogramData;  
  44. }  
计算巴氏系数的代码如下:

[java]  view plain copy
  1. /** 
  2.  * Bhattacharyya Coefficient 
  3.  * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf 
  4.  *  
  5.  * @return 
  6.  */  
  7. public double modelMatch() {  
  8.     HistogramFilter hfilter = new HistogramFilter();  
  9.     float[] sourceData = hfilter.filter(sourceImage, null);  
  10.     float[] candidateData = hfilter.filter(candidateImage, null);  
  11.     double[] mixedData = new double[sourceData.length];  
  12.     for(int i=0; i<sourceData.length; i++ ) {  
  13.         mixedData[i] = Math.sqrt(sourceData[i] * candidateData[i]);  
  14.     }  
  15.       
  16.     // The values of Bhattacharyya Coefficient ranges from 0 to 1,  
  17.     double similarity = 0;  
  18.     for(int i=0; i<mixedData.length; i++ ) {  
  19.         similarity += mixedData[i];  
  20.     }  
  21.       
  22.     // The degree of similarity  
  23.     return similarity;  
  24. }  
相关文章
|
数据可视化 算法 计算机视觉
【计算机视觉】图像增强----图像的傅立叶变换
【计算机视觉】图像增强----图像的傅立叶变换
536 0
【计算机视觉】图像增强----图像的傅立叶变换
|
计算机视觉
【计算机视觉】图像增强----直方图均衡化
主要介绍图像增强中直方图均衡化的原理以及相关实操及分析。
655 0
【计算机视觉】图像增强----直方图均衡化
|
编解码 算法 计算机视觉
小波分析法图像处理----图像增强
小波分析法图像处理----图像增强
655 0
小波分析法图像处理----图像增强
|
资源调度 计算机视觉 Java
图像处理------图像加噪
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">图像噪声源于现实世界中数字信号总会受到各种各样的干扰,最终接受的图像和源于的数字信号之间总</p> <p style="color: rgb(51, 51, 51); font-family: Arial; fon
1594 0
|
Java 计算机视觉 算法
图像处理------移动模糊
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">卷积模糊或者卷积平滑滤波,可以消除图像噪声,也可以产生一些常见的图像模糊特效,但</p> <p style="color: rgb(51, 51, 51); font-family: Arial; font-siz
1206 0
|
计算机视觉 Java
图像处理------直方图均衡化
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;"><strong>基本思想</strong>:</span></p> <p style="color: rgb(51, 51, 51); font-fam
1438 0
|
资源调度 算法 Java
图像处理------高斯模糊
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">高斯模糊是一种两维的卷积模糊操作,在图像完成高斯模糊相对于均值模糊来说,</p> <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 1
1590 0
图像分析------直方图分析
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><strong><span style="color: rgb(255, 0, 0);"><span style="font-size: 16px;">直方图介绍</span></span></strong></p
2507 0
|
Java 计算机视觉 算法
图像处理------基于像素的图像混合
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><span style="font-size: 18px;">介绍几种常见的将两张图像混合在一起形成一张新的图像的算法,</span></p> <p style="color: rgb(51, 51, 51); f
1228 0
|
算法 Java 计算机视觉
图像处理------基于像素的皮肤检测技术
<p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">基于像素的皮肤检测技术</p> <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;">
2115 0