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):图像滤波
滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号.其中像素点灰度值的高低代表信号的强弱. 高频:图像中灰度变化剧烈的点. 低频:图像中平坦的,灰度变化不大的点. 根据图像的高频与 ...
随机推荐
- 下载百度上的图片C#——输入名字就可以下载
using System; using System.Collections.Generic; using System.Data; using System.Configuration; using ...
- Python学习之模块进程函数详解
今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...
- 60行JavaScript俄罗斯方块
<!doctype html><html><head></head><body> <div id="box" st ...
- iOS监听键盘事件
#pragma mark - view life cycle - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter def ...
- Unity 播放 视频
Unity3D 播放视频 http://www.cnblogs.com/fortomorrow/archive/2012/11/01/unity07.html Unity3D研究院之两种方式播放游戏视 ...
- group
学习Linq时,经常会遇到Linq使用Group By问题,这里将介绍Linq使用Group By问题的解决方法. 1.计数 var q = from p in db.Products group p ...
- Yii2.0 GridView 新增添加按钮
<?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'col ...
- iOS- Could not find a storyboard named 'Main' in bundle NSBundle
1.删掉工程中main.storyboard 后要删除plist文件中对应的键值,否则会报如下错误: Could not find a storyboard named 'Main' in bundl ...
- [js/jquery]移动端手势拖动,放大,缩小预览图片
摘要 有这样的需求需要在手机端预览图片的时候,实现图片的手势拖动,放大缩小功能.最终通过touch.js这个插件实现了效果. touch.js Touch.js是移动设备上的手势识别与事件库, 由百度 ...
- SQL 查询总结
参考资料: SELECT 查询语句格式与简单查询 SQL中distinct的用法 SQL 查询总结