本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率。在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBackProject,计算图像src中每个像素在直方图中的概率,最终的结果在result中,result中每个像素表示该像素在直方图中的概率,我们对得到的结果进行二值化,就得到下边右图的结果。

我们框选了一块白云区域,但从背投影结果中,海浪的边缘在直方图中的概率也很高,这是因为它们的灰度比较相似,如果我们只想白云的位置,最好使用三通道的直方图,然后背投影。

cv::calcBackProject(&src,
    1,            // 一副图像
    channels,     // 使用的channel
    hist,    // backprojecting的直方图
    result,       // 结果图像
    ranges,       //像素值范围
    255.0         //缩放因子
    );

完整的代码:

int main( int argc, char** argv )
{
Mat src, dst; /// 以单通道方式打开图像
src = cv::imread("../waves.jpg", 0); if( !src.data )
{ return -1; } //选择一个ROI区域
cv::Mat imageROI; imageROI = src(cv::Rect(360,55,40,50)); int histSize[1]; //bins的数目,对灰度图像通常是256
float hranges[2];//最大和最小的像素值
const float* ranges[1];//指向hranges
int channels[1]; //在本程序中,只用了一个channel
bool uniform = true; bool accumulate = false;
histSize[0]= 256;
hranges[0]= 0.0; //最小像素值
hranges[1]= 255.0; //最大像素值
ranges[0]= hranges;
channels[0]= 0; // 缺省状态下,我们取channel0
//结果直方图
Mat hist;
Mat result;
/// 计算直方图
//第二个参数1表示只对一副图像进行直方图处理
//第三个参数表示只处理channel 0,对多个channel的图像,可以选1,2等等。
//第四个参数Mat(),表示不使用掩码
//hist是直方图结果
//第六个参数1表示是1维直方图
//第七个参数,直方图bin的数目
//第八个参数是像素取值范围,第九个参数是各维取值范围相同,第十个参数是是否累加,如果处理多个图像,需要这个参数。
calcHist( &imageROI, 1, 0, Mat(), hist, 1, histSize, ranges, uniform, accumulate ); //直方图结果归一化
cv::normalize(hist,hist,1.0); //计算back
cv::calcBackProject(&src,
1, // 一副图像
channels, // 使用的channel
hist, // backprojecting的直方图
result, // 结果图像
ranges, //像素值范围
255.0 //缩放因子
); // 二值化图像,看是否能分开前景和背景
cv::threshold(result,result,20,255,cv::THRESH_BINARY);
/// 显示直方图
namedWindow("result", CV_WINDOW_AUTOSIZE );
imshow("result", result ); // 显示原图像
cv::rectangle(src, cv::Rect(360,55,40,50), cv::Scalar(0,0,255)); namedWindow("image", CV_WINDOW_AUTOSIZE );
imshow("image", src); while(1)
waitKey(0); return 0; }

程序代码:工程FirstOpenCV20

下面的程序中,使用BGR三通道直方图,注意我们框选的范围包括蓝天,也包括白云,之所以包括蓝天白云,是因为这样可以剔除海水边缘白色,我们还对原始图像进行了减色处理。

程序代码:工程FirstOpenCV21

OpenCV学习(26) 直方图(3)的更多相关文章

  1. OpenCV学习(24) 直方图(1)

    直方图是对数据的统计,并将统计结果分布于一系列预定义的槽中.这里的数据不仅仅指的是灰度值,它可以是任何能有效描述图像特征的数据,比如图像梯度等等. 假设有一个矩阵包含一张图像的信息 (灰度值 0-25 ...

  2. OpenCV学习(27) 直方图(4)

    我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体.下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的 ...

  3. OpenCV学习(25) 直方图(2)

    在OpenCV中,也可以对三通道的图像,比如BGR,HSV等计算直方图.方法和计算单通道图像直方图相似,下面的代码描述了如何计算一个BGR三通道图像的直方图,需要注意的是,因为是三通道,每个通道取值都 ...

  4. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  5. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

  6. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  7. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  8. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  9. opencv学习笔记(五)镜像对称

    opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...

随机推荐

  1. ionic启动App时不使用淡入淡出效果

    找到我们项目下面 res下面的config.xml,然后加入下面两句就可以解决. <preference name="FadeSplashScreen" value=&quo ...

  2. ECshop语言包lang的加载原理

    当前使用的ecshop的版本:2.7.3,ecshop 2.7.3版本的网店系统的语言包的位置是ecshop文件下 languages/xxx/   其中的xxx表示各种语言的文件夹,里面存放指定语言 ...

  3. 【知了堂学习笔记】java 正则表达式

    本文参考网络上面别人的博客知识产出 正则表达式基础 1.句号 假设你想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束.另外,假设有一本英文字典,你可以用正则表达式搜索它的全部 ...

  4. PHP接入支付宝支付

    创建应用 使用支付宝账号登录开放平台创建应用,应用创建成功之后可以得到APPID等相关信息 接着需要设置RSA密钥,可以使用蚂蚁金服开放平台提供的生成工具,生成完密钥需在开放平台中填写. 代码接入 引 ...

  5. (五)静态断言(下),static_assert

    二.静态断言与static_assert 通过上一篇,我们可以看到,断言assert宏只有在程序运行的时候才能起作用.而#error值在编译器预处理时才能起作用. 有时候,我们希望在编译时候能做一些断 ...

  6. IdentityServer4之JWT签名(RSA加密证书)及验签

    一.前言 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢? 二.JWT与Reference Token ...

  7. 学会使用DNSPod,仅需三步

    学会使用DNSPod,仅需三步   第一步:在DNSPod添加记录 1.访问 https://www.dnspod.cn网站,在DNSPod官网首页的右上角,有[注册],如下图所示,点击[注册]按钮 ...

  8. ARM 内核

    ARM相关知识: ARM核:A8,ARM11,ARM9 指令架构:ARMv7,ARMv6,ARMv4 ARM核分为两个阵营: 经典型:ARM7,ARM9,ARM11 Cortex: Cortex A: ...

  9. Ubuntu18.04 创建桌面快捷方式

    一.基本概念 Linux 系统中的Desktop Entry 文件以desktop为后缀名.Desktop Entry 文件是 Linux 桌面系统中用于描述程序启动配置信息的文件.  进入/usr/ ...

  10. [WC2014]时空穿梭(莫比乌斯反演)

    https://www.cnblogs.com/CQzhangyu/p/7891363.html 不难推到$\sum\limits_{D=1}^{m_1}\sum\limits_{d|D}C_{d-1 ...