OpenCV成长之路:图像直方图的应用

2014-04-11 13:57:03
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ronny.blog.51cto.com/8801997/1394118

正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用。

一、直方图的反向映射。

我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检测范围,这一般获得皮肤的颜色范围还需要定义阈值并不断的调整,实际中参数太多而不容易控制。

这里我们就可以考虑用直方图的反射映射。

1,收集人脸皮肤样本。

2,拼合样本并计算其颜色直方图。

3,将得到的样本颜色直方图反射映射到待检测的图片中,然后进行阈值化即可。

这里为了简单起见,我们只用两张人脸样本,实际中可以进一步扩展。

在提取样本皮肤的直方图时,我们需要对这些样本图像做一些处理,比如把头发、眼睛等部位去除,我们这里使用一个mask即可。

由于我们要计算彩色直方图像,为了简化色彩,我们还需要对颜色降维,相关函数在本系列文章第2篇中已经有介绍了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main()
{
    Mat face=imread("../face.png");        // 样本
    Mat ImgSrc=imread("../img.png");    // 待检测的图像
    //图像降维
    colorReduce(face,face,32);
    colorReduce(ImgSrc,ImgSrc,32);
           
    // 计算颜色直方图
    const int channels[3]={0,1,2};
    const int histSize[3]={256,256,256};
    float hranges[2]={0,255};
    const float* ranges[3]={hranges,hranges,hranges};
    MatND hist;
    calcHist(&face,1,channels,Mat(),hist,3,histSize,ranges);
    // 直方图归一化
    normalize(hist,hist,1.0);
    // 直方图反向映射
    Mat result;
    calcBackProject(&ImgSrc,1,channels,hist,result,ranges,255);
    // 将结果进行阈值化
    threshold(result,result,255*(0.05),255,THRESH_BINARY);
return 0;
}

上面程序中有以下几点值得说明:

1,在作彩色图像直方图的反向映射时,一般需要对图像颜色进行降维。

2,OpenCV中提供的函数clacBackProject用于计算直方图的反向映射,其参数和计算直方图的参数大体相同。

3,threshold是一个阈值化的函数。

二、图像相似性的比较

图像相似性比较是比上面直方图映射更加实用且普通的例子,前段时间淘宝或百度推出类似搜图的功能都离不开图像相似性判断这个话题,当然本文这里面不可能去深入探讨那些解决方案的实现,只是利用OpenCV中的例程来简单的实现图片的匹配。 
下面我们来计算两幅图像之间的相似度:我们以左边一幅图像作为参考图像,是没有车辆停放时的图像,右边两幅跟左边比较计算相似性。中间一幅是有车辆停放时,右边一幅是另一个时刻没有车辆停放时。

这个例子实际可以应用在停车位上车辆检测上面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    Mat refImg=imread("../ref.png");
    Mat image1=imread("../image1.png");
    Mat image2=imread("../image2.png");
       
    ColorHistogram imgHist;
    //图像颜色降维
    refImg=imgHist.colorReduce(refImg,64);
    image1=imgHist.colorReduce(image1,64);
    image2=imgHist.colorReduce(image2,64);
    MatND refH=imgHist.getHistogram(refImg);
    MatND hist1=imgHist.getHistogram(image1);
    MatND hist2=imgHist.getHistogram(image2);
    double dist1,dist2;
    dist1=compareHist(refH,hist1,CV_COMP_BHATTACHARYYA);
    dist2=compareHist(refH,hist2,CV_COMP_BHATTACHARYYA);
    std::cout<<"dist1="<<dist1<<",dist2="<<dist2<<std::endl;
    return 0;
}

最终输出结果为:

dist1=0.69

dist2=0.08

上面程序中有以下几点值得说明:

1,程序中ColorHistogram是自定义的一个类,其中包括了直方图求取与图像的颜色降维,

2,直方图的比较函数为compareHist(refH,imgH,CV_COMP_XX),最后一个参数是两个矢量间距离计算的方法。

本文出自 “Ronny的成长之路” 博客,请务必保留此出处http://ronny.blog.51cto.com/8801997/1394118

OpenCV成长之路:图像直方图的应用的更多相关文章

  1. OpenCV成长之路:图像滤波

    http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...

  2. OpenCV成长之路:直线、轮廓的提取与描述

    http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  3. OpenCV成长之路(5):图像直方图的应用

    正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射. 我们以人脸检测举例,在人脸检测中,我们第一步往往需要 ...

  4. OpenCV成长之路(4):图像直方图

    一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...

  5. OpenCV成长之路:图像直方图

    http://ronny.blog.51cto.com/8801997/1394115 2014-04-11 13:47:27 标签:opencv 直方图 统计表 原创作品,允许转载,转载时请务必以超 ...

  6. OpenCV成长之路(9):特征点检测与图像匹配

    特征点又称兴趣点.关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像.进行图像配准.进行3D重建等.本文主要介绍OpenCV中几种定位与表示关键点的函数. 一.Harris ...

  7. OpenCV成长之路(2):图像的遍历

    我们在实际应用中对图像进行的操作,往往并不是将图像作为一个整体进行操作,而是对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题. 一.遍历图像的4种方 ...

  8. OpenCV成长之路(7):图像滤波

    滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号.其中像素点灰度值的高低代表信号的强弱. 高频:图像中灰度变化剧烈的点. 低频:图像中平坦的,灰度变化不大的点. 根据图像的高频与 ...

  9. OpenCV成长之路 01、图像的读写与显示

    一.工具篇 工欲善其事,必先利其器.学习OpenCV,肯定少不于基本的编程工具与OpenCV库.在Windows平台下你可以选择Visual Studio.CodeBlock等,当然你也可以选择在Li ...

随机推荐

  1. 无法启动MYSQL服务”1067 进程意外终止”解决办法

    原文:http://www.111cn.net/database/mysql/48888.htm   本文章主要是总结了各种导致mysql提示无法启动MYSQL服务"1067 进程意外终止& ...

  2. Python 修炼3

    # 列表 功能方法 *补充(zip zip(list1,list2) 会形成一个[(),()]新的列表list1和list2一一对应得组成一个新的元素以元组最为单位) # 1.修改# li = [1, ...

  3. sqlserver和Windows资源管理器争用内存

    sqlserver和Windows资源管理器在设置成相同的优先级的情况下(普通),Windows资源管理器优先于sqlserver对内存的征用.开始是

  4. Spring 配置文件XML -- <beans>中属性概述

    beans : xml文件的根节点. xmlns : XML NameSpace的缩写,因为XML文件的标签名称都是自定义的,自己写的和其他人定义的标签很有可能会重复命名,而功能却不一样,所以需要加上 ...

  5. Jni Tips

    1.JavaVM and JNIEnv JNI有两种关键的数据结构,JavaVM和JNIEnv,两者均为指向VM方法JNI方法的列表的的指针(C++版本中它们是Class,Class的所有成员均为函数 ...

  6. jQuery 源码学习(先放在这,未开始)

    希望对源码有一个框架上认识,对整体结构有一个理解. 对外只暴露出了一个变量,$/jQuery,这个变量指向一个函数 function(a,b){return new n.fn.init(a,b)}

  7. 解决ubuntu下的firefox无法在线播放音频和视频的问题

    一贯无视 Linux 平台的腾讯(无贬义)理所当然地没有开发QQ音乐Linux版,于是想尝试QQ音乐网页版,结果发现歌曲无法播放.刚开始以为是腾讯还在网页版上用万恶的 Windows Media Pl ...

  8. hdu1008

    //c++// #includeusing namespace std;int main(){int n,j,t,start;while (cin >> n,n){start =0;t = ...

  9. 第一百零四节,JavaScript时间与日期

    JavaScript时间与日期 学习要点: 1.Date类型 2.通用的方法 3.格式化方法 4.组件方法 ECMAScript提供了Date类型来处理时间和日期.Date类型内置一系列获取和设置日期 ...

  10. 第六十六节,htnl音频视频

    htnl音频视频 学习要点:     1.音频和视频概述     2.video视频元素     3.audio音频元素 本章主要探讨HTML5中音频和视频元素,通过这两个原生的媒体元素向HTML页面 ...