OpenCV中直方图反向投影算法详解与实现

news/2024/7/1 10:31:49

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达本文转自:opencv学堂

一:直方图交叉

OpenCV中直方图反向投影算法实现来自一篇论文《Indexing Via Color Histograms》其作者有两位、是Michael.J.Swain与Dana H. Ballard。论文分为两个部分,前面一部分详细描述了颜色直方图以及通过颜色直方图交叉来实现对象鉴别。可以实现对象背景区分、复杂场景中查找对象、不同光照条件影响等。假设M表示模型直方图数据、I表示图像直方图数据、直方图交叉匹配可以被描述为如下:

其中J表示直方图的范围,即bin的个数。最终得到结果是表示多少个模型颜色像素与图像中的像素相同或者相似,值越大,表示越相似。归一化表示如下:

这种方法对背景像素变换可以保持稳定性、同时对尺度变换也有一定抗干扰作用,但是无法做到尺度不变性特征。基于上述理论,两位作者发现通过该方法可以定位图像中已知物体的位置,它们把这个方法叫做直方图反向投影(Back Projection)。

二:直方图反向投影

直方图反向投影可以通过如下步骤完成

  1. 对每个直方图BIN J

  2. 对图像的每个像素点I(x,y)根据像素值获得对应的直方图分布概率

  3. 对得到分布概率图像做卷积

  4. 求取局部最大值,即得到已知物体位置信息

正是因为直方图反向投影有这样能力,所以在经典的MeanShift与CAMeanShift跟踪算法中一直是通过直方图反向投影来实现已知对象物体的定位。

三:基于OpenCV算法代码实现 

算法实现基于OpenCV的数据结构Mat来实现数据转换与存储,其它的地方基本都是自己写,上次有同学说我的代码都是Java的,这次全部改为C++啦,所以请大家继续关注本公众号!

第一步:直方图计算

OpenCV自己实现通过对直方图插值实现LUT查找,不做RGB颜色降维,本人的实现反其道而行之,对图像颜色做降维得到直方图,不再对直方图计算使用LUT插值查找。

void calculate_histogram(Mat &image, Mat &hist) {int width = image.cols;int height = image.rows;int r = 0, g = 0, b = 0;int index = 0;int level = 256 / bins;for (int row = 0; row < height; row++) {uchar* current = image.ptr<uchar>(row);for (int col = 0; col < width; col++) {if (image.channels() == 3) {b = *current++;g = *current++;r = *current++;index = (r / level) + (g / level)*bins + (b / level)*bins*bins;}if (image.channels() == 1) {r = *current++;index = (r / level);}hist.at<int>(index, 0)++;}}
}

计算输入图像与模型的直方图代码如下

Mat mHist = Mat::zeros(total, 1, CV_32SC1);
Mat iHist = Mat::zeros(total, 1, CV_32SC1);
calculate_histogram(model, mHist);
calculate_histogram(src, iHist);

第二步:计算R

Mat rhist = Mat::zeros(total, 1, CV_32FC1);
float m = 0, t = 0;
for (int i = 0; i < total; i++) {m = mHist.at<int>(i, 0);t = iHist.at<int>(i, 0);rhist.at<float>(i, 0) = m / t;
}

第三步:计算概率分布图像

// 查找权重概率分布
int r = 0, g = 0, b = 0;
int level = 256 / bins;
int index = 0;
Mat w = Mat::zeros(src.size(), CV_32FC1);
for (int row = 0; row < src.rows; row++) {uchar* current = src.ptr<uchar>(row);for (int col = 0; col < src.cols; col++) {if (src.channels() == 3) {b = *current++;g = *current++;r = *current++;index = (r / level) + (g / level)*bins + (b / level)*bins*bins;w.at<float>(row, col) = rhist.at<float>(index, 0);} else {r = *current++;index = (r / level);w.at<float>(row, col) = rhist.at<float>(index, 0);}}
}

第四步:卷积计算

Mat dst;
Mat kernel = (Mat_<float>(3, 3) << 1, 1, 1,1, 1, 1,1, 1, 1);
filter2D(w, dst, -1, kernel);

第五步:归一化与显示反向投影结果

Mat result;
normalize(dst, result, 0, 255, NORM_MINMAX);
imshow("BackProjection Demo", result);

四:运行演示

已知目标图像

反向投影结果

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


http://lihuaxi.xjx100.cn/news/277945.html

相关文章

AI如何赋能金融行业?百度、图灵深视等同台分享技术实践

近日&#xff0c;由BTCMEX举办的金融技术创新研讨会在北京举办。BTCMEX投资人李笑来&#xff0c;AI技术公司TuringPass、百度、美国Apache基金会项目Pulsar、区块链安全公司SlowMist等相关专家参加了此次会议&#xff0c;共同探讨了金融技术在创新方面的现状。 图灵深视副总裁许…

你太菜了,竟然不知道Code Review...

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试资料作者&#xff1a;宝玉 来源&#xff1a;http://1t.click/aA4h我一直认为Code Review&#xff08;代码审查&#xff09;是软件开发中的最佳实践之一&#xff0c;可以有效提高整体代码质量&…

13种编程语言名称的来历

转, 原文&#xff1a; http://jandan.net/2014/03/23/programming-languages.html ----------------------------------------------------------------------------------------------------------------- 可能程序员们都认为编写代码时给变量取名是件烦人的事&#xff0c;不过…

docker部署springboot_Docker+SpringBoot快速构建和部署应用

前言Docker技术发展为当前流行的微服务提供了更加便利的环境&#xff0c;使用SpringBootDocker部署和发布应用&#xff0c;其实也是一件比较简单的事情。当前&#xff0c;前提是得有Docker的基础。构建一个SpringBoot项目本人最早的一篇文章&#xff0c;就是教大家如何使用Spri…

幼儿园带括号算式口诀_初中数学必会的26个知识点口诀

1.有理数的加法运算同号相加一边倒&#xff1b;异号相加“大”减“小”&#xff0c;符号跟着大的跑&#xff1b;绝对值相等“零”正好&#xff0e;2.合并同类项合并同类项&#xff0c;法则不能忘&#xff0c;只求系数和&#xff0c;字母、指数不变样&#xff0e;3.去、添括号法…

12个现实世界中的机器学习真相

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达作者&#xff1a;Delip编译&#xff1a;ronghuaiyang导读当你在现实世界中工作时&#xff0c;有几个事实是你必须面对的&#xff0c;这也是本文的主要内容。上个月&#x…

腾讯AI Lab 16篇入选ECCV 2020(含论文解读)

点击上方“视学算法”&#xff0c;选择加"星标"置顶重磅干货&#xff0c;第一时间送达本文转载自&#xff1a;腾讯AI实验室计算机视觉领域三大顶会之一的 ECCV&#xff08;欧洲计算机视觉会议&#xff09;今年将于 8 月 23-28 日举办。受新冠肺炎疫情影响&#xff0c…

给Linux初学者的七个建议,值得一读

刚开始使用Linux时你也许会感到不习惯&#xff0c;许多高手也都有这样的经历。毕竟&#xff0c;曾经他们也都是新手。但是现在Linux团体已经在为新用户提供有关指南&#xff0c; 手册和基本的技术文档来使他们尽快上手方面做的相当出色。三年前我首次接触Linux&#xff0c;很多…