0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单探讨一下直方图及其反向投影的应用

冬至子 来源:技术铺子 作者:chasenzhang 2023-01-18 10:35 次阅读

前言

计算机视觉中,直方图的有着很广泛的的应用,通常用来统计图像中的某些特征,比如边缘特征、色彩特征、梯度特征等等。

直方图通过一种统计的方法,来表征图形的特征。这篇文章简单来探讨一下直方图以及它的一个应用--反向投影。

直方图

直返图的计算其实很简单,和我们数学中的直方图差不多,就是统计某一特征,在这里我们用统计灰度值举例子。

首先来看一段画直方图的代码:

#include 
#include 


using namespace cv;
using namespace std;


int main(int argc, char **argv)
{
    Mat img = imread("football2.png");
    cout << "img size " << img.size() << endl;
    cvtColor(img, img, COLOR_BGR2GRAY);
    imshow("img", img);


    Rect rect(330, 270, 160, 160); //lofated of football
    Mat img_obj = img(rect);
    imshow("img_obj", img_obj);


    int bin = 4;
    int channels = 0;
    int size = 256 / bin;
    float hranges[] = {0, 256};
    const float *ranges[] = {hranges};
    const float *ranges_back = {hranges};


    // 计算直方图
    MatND hist;
    calcHist(&img_obj, 1, &channels, Mat(), hist, 1, &size, ranges);


    double minValue = 0;
    double maxValue = 0;
    minMaxLoc(hist, &minValue, &maxValue, 0, 0);
    cout << "maxValue: " << maxValue << endl;


    Mat img_hist(maxValue, size, CV_8UC3, Scalar(0, 0, 0));
    for (int i = 0; i < size; i++)
    {
        float bin_value = hist.at<float>(i);
        rectangle(img_hist,Point(i, maxValue), Point(i+1, maxValue-bin_value), Scalar(0, 255, 0));
    }
    imshow("img_hist", img_hist);


    ......
    waitKey(0);
    return 0;
}

直方图有个一概念,就是bin,其实是组距的意思,代码中是4,就是按照[0, 4)、[4, 8)、[8, 12)......[251,255)为x轴来做统计的。

整个代码其实简单,OpenCV画直方图的函数是calcHist,我们要了解函数的用法以及每个参数的意思,在这了不在赘述。另外,它的原理其实不难,如果想自己实现一下,应该也是比较简单的。

反向投影

在这篇博客https://blog.csdn.net/zhangjunp3/article/details/79862424是这样说的

反向投影其实是直方图运算的逆过程。直方图运算是统计每个灰度值对应的像素个数,而反向投影则是将像素个数回送到该像素个数对应灰度区间的像素位置。

反向投影是直方图运算的逆过程,这个是最最要的内容,上面讲的已经差不多了,下面我们自己来实现一下反向投影。

接着上面直方图的代码继续:

......
  //将直方图归一化为[0, 255]区间,方面下面可视化
    normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());


    Mat img_back_proj = img.clone();
    for (int i = 0; i < img_back_proj.rows; i++)
    {
        uchar *p = img_back_proj.ptr

代码的核心就是这句话:p[j] = hist.at(p[j] / bin);

将p[j]位置的像素值带到直放图的x轴,得到该像素值在直方图中的个数,用统计的个数取代原先的像素值。

代码的运行结果如下:

2.jpg

可以看出来,在这个例子中足球的匹配效果还是很好的,

在这个例子中,我们用的是灰度值做的直方图,另外的一些特征,比如颜色,边缘都是可以用来做统计的。

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机视觉
    +关注

    关注

    8

    文章

    1602

    浏览量

    45662
  • OpenCV
    +关注

    关注

    29

    文章

    612

    浏览量

    40819
收藏 人收藏

    评论

    相关推荐

    文带你了解FPGA直方图操作

    灰度变换等处理过程。 而FPGA对于直方图处理主要分为以下三种: 我们常见或者听说的直方图概念主要指直方图均衡,这也是最简单种方式,常
    发表于 01-10 15:07

    投影机有哪些技术及其含义

    投影机有哪些技术及其含义投影机自问世以来发展至今已形成三大系列: LCD( Liquid Crystal Display)液晶投影机DLP(Digital Lighting Proce
    发表于 11-17 16:03

    探讨一下,CRC校验的优势

    本帖最后由 ntmusic 于 2014-6-11 11:31 编辑 探讨一下,使用计算的2字节的CRC校验码和使用固定的2字节数据作为校验在保证数据传输正确方面有什么不同?
    发表于 06-11 11:21

    探讨一下这个可行?

    电子元器件、打板PCB、探讨等等,既可以省钱也可以交到有想法有创意的朋友,供电子DIY爱好者方便DIY。欢迎各位坛友起讨论一下,尽可能的提出各种问题,待时机成熟时
    发表于 05-30 21:26

    请教一下有关直方图的问题

    刚学习使用labview不久,照着教材做了简单的统计分析模块。直接显示单个信号的直方图并没有问题,但是在加入了个信号选择模块后发现,每次切换信号,
    发表于 07-22 16:44

    探讨一下16通道恒流输出精度及计算   

    探讨一下16通道恒流输出精度及计算  
    发表于 06-03 07:17

    探讨一下关于STM32中的中断系统

    大大增加,而且中断的设置也更加复杂。今天就将来探讨一下关于STM32中的中断系统。1 基本概念ARM Coetex-M3内核共支持256个中断,其中16个内部中断,2
    发表于 08-17 08:29

    探讨一下关于电机轴承的数据集

    这篇和大家探讨一下关于电机轴承的数据集电机轴承的数据集目前较多采用的是CWRU(凯斯西储大学轴承数据中心)这是个针对于全球学者的公开数据集,下面给大家分享一下该数据集的获取
    发表于 09-08 06:52

    一下直流UPS电源的板子

    今天准备做一下直流UPS电源的板子。之前有些资源了,需要做一下整合。UPS分为在线模式和续电模式。在线模式是开关电源的直接输出,续电模式是蓄电池的输出。在线模式中,同时给蓄电池充电。...
    发表于 12-28 08:22

    一下PID控制及其用法

    PID:智能小车入门(位置式和增量式)PID的公式今年大二,以个新人的角度来说一下PID及其用法,新人第次写,有不对的请各位指正。手动狗头
    发表于 01-14 06:03

    请问一下直线电机的磁吸力对光栅尺信号有什么影响呢?

    请问一下直线电机的磁吸力对光栅尺信号有什么影响呢?
    发表于 03-07 15:29

    请问一下直流有刷电机在换向的时候为什么电压会波动呢?

    请问一下直流有刷电机在换向的时候为什么电压会波动呢?
    发表于 03-17 14:34

    反向投影_《OpenCV3编程入门》书本配套源代码

    《OpenCV3编程入门》书本配套源代码:反向投影
    发表于 06-06 15:39 6次下载

    关于彩色图像高斯反向投影基于OpenCV的C++代码

    图像反向投影的最终目的是获取ROI然后实现对ROI区域的标注、识别、测量等图像处理与分析,是计算机视觉与人工智能的常见方法之一。图像反向投影通常是彩色图像
    的头像 发表于 05-31 10:31 771次阅读

    图像直方图的应用场景研究

    需要注意的是,直方图反向投影是基于颜色的,所以会对RGB彩色图像转换到HSV色彩空间,然后基于H跟S两个通道生成2D直方图数据分布,如下图所示:
    的头像 发表于 12-22 09:53 596次阅读