OpenCV成长之路(5):图像直方图的应用
正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用。
一、直方图的反向映射。
我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检测范围,这一般获得皮肤的颜色范围还需要定义阈值并不断的调整,实际中参数太多而不容易控制。
这里我们就可以考虑用直方图的反射映射。
1,收集人脸皮肤样本。
2,拼合样本并计算其颜色直方图。
3,将得到的样本颜色直方图反射映射到待检测的图片中,然后进行阈值化即可。
这里为了简单起见,我们只用两张人脸样本,实际中可以进一步扩展。

在提取样本皮肤的直方图时,我们需要对这些样本图像做一些处理,比如把头发、眼睛等部位去除,我们这里使用一个mask即可。
由于我们要计算彩色直方图像,为了简化色彩,我们还需要对颜色降维,相关函数在本系列文章第2篇中已经有介绍了。
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中的例程来简单的实现图片的匹配。
下面我们来计算两幅图像之间的相似度:我们以左边一幅图像作为参考图像,是没有车辆停放时的图像,右边两幅跟左边比较计算相似性。中间一幅是有车辆停放时,右边一幅是另一个时刻没有车辆停放时。
这个例子实际可以应用在停车位上车辆检测上面:



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),最后一个参数是两个矢量间距离计算的方法。
OpenCV成长之路(5):图像直方图的应用的更多相关文章
- OpenCV成长之路:图像直方图的应用
OpenCV成长之路:图像直方图的应用 2014-04-11 13:57:03 标签:opencv 图像 直方图 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否 ...
- OpenCV成长之路:图像直方图
http://ronny.blog.51cto.com/8801997/1394115 2014-04-11 13:47:27 标签:opencv 直方图 统计表 原创作品,允许转载,转载时请务必以超 ...
- OpenCV成长之路:图像滤波
http://ronny.blog.51cto.com/8801997/1394138 OpenCV成长之路:图像滤波 2014-04-11 14:28:44 标签:opencv 边缘检测 sobel ...
- OpenCV成长之路:直线、轮廓的提取与描述
http://ronny.blog.51cto.com/8801997/1394139 OpenCV成长之路:直线.轮廓的提取与描述 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...
- OpenCV成长之路(4):图像直方图
一.图像直方图的概念 图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的.纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比. 图 ...
- Python+OpenCV图像处理(八)—— 图像直方图
直方图简介:图像的直方图是用来表现图像中亮度分布的直方图,给出的是图像中某个亮度或者某个范围亮度下共有几个像素.还不明白?就是统计一幅图某个亮度像素数量.比如对于灰度值12,一幅图里面有2000 个像 ...
- Python 图像处理 OpenCV (16):图像直方图
前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...
- OpenCV成长之路(2):图像的遍历
我们在实际应用中对图像进行的操作,往往并不是将图像作为一个整体进行操作,而是对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题. 一.遍历图像的4种方 ...
- OpenCV成长之路(7):图像滤波
滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号.其中像素点灰度值的高低代表信号的强弱. 高频:图像中灰度变化剧烈的点. 低频:图像中平坦的,灰度变化不大的点. 根据图像的高频与 ...
随机推荐
- StringBuilder 拼接sql语句比较快
StringBuilder 拼接sql语句比较快StringBuilder strBuilder = new StringBuilder();strSql += "insert into t ...
- Unity Particle System Sorting Order
http://answers.unity3d.com/questions/577288/particle-system-rendering-behind-sprites.html
- dedecms笔记
截取字符串 方法一: [field:title function="cn_substr(@me,10)"/] 方法二: {dede:arclist typeid=’9′ title ...
- new和alloc init的区别
背景说明,new是较为老式的写法,后来发现只有一个new不好使,才引入了alloc和init这种写 法,保留new一是向后兼容,二是很多时候是一种更简单的写法.其实是一样的,new在内部调用 的all ...
- Python 文件读写,条件循环(三次登录锁定账号实例)
通过文件读写,条件循环相关语法,实现三次登录失败则锁定该账号的功能 需求一 """需求描述: 1.输入正确账号,密码,退出程序 2.登录失败,重新输入账号密码 3.同一账 ...
- Thread 与 Runnable
在Java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- sublime设置
修改字体: "font_face": "Monaco", "font_size": 14.0
- .NET Core、DNX、DNU、DNVM、MVC6学习资料
一.资源 1.http://dotnet.github.io/ 2.http://www.codeproject.com/Articles/1005145/DNVM-DNX-and-DNU-Under ...
- 遍历JObject
JObject jo = JObject.Parse(jsonStr); IEnumerable<JProperty> properties = jo.Properties(); fore ...
- Spring回调方法DisposableBean接口
除了自定义的destroy-method.还可以实现DisposableBean接口,来回调bean销毁时候执行的方法,这个接口有一个destroy方法,生命周期是是destroy----bean销毁 ...