Opencv Cookbook阅读笔记(四):用直方图统计像素
灰度直方图的定义
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream> using namespace cv;
using namespace std; class Histogram1D
{
//定义一个处理单通道的类
private:
int histSize[];//bin的数量
float hranges[];//值范置
const float* ranges[];//值范围的指针.指向常量的指针(所指对像不一定是个常量),不能通过指针修改其值
int channels[];//通道数量 Mat getHistogram(const Mat &image)
{
//统计直方图
Mat hist;
calcHist(&image, ,//一个图像的直方图
channels,//使用的通道
Mat(),//不使用掩码
hist,//作为结果的直方图
,//一维直方图
histSize,
ranges
); return hist;
} public:
Histogram1D()
{
histSize[] = ;
hranges[] = ;//从0到256
hranges[] = ; ranges[] = hranges; channels[] = ;
} Mat getImageOfHistogram(const Mat &image, int zoom=)
{
//zoom通道数
//画出直方图 Mat hist = getHistogram(image); return getImageOfHistogram1(hist, zoom);
} //定义为静态,不对成员变量进行操作
static Mat getImageOfHistogram1(const Mat &hist, int zoom)
{
//取得箱子的最大值和最小值
double maxVal = , minVal = ;
minMaxLoc(hist, &minVal, &maxVal,,); int histSize = hist.rows;
//用于显示的直方图
Mat histImg(histSize*zoom, histSize*zoom, CV_8U, Scalar());
//设置最高点为90%的箱子个数
int hpt = static_cast<int>(0.9*histSize); //为每个箱子画垂线
for (int h = ; h < histSize; h++)
{
float binVal = hist.at<float>(h);
if (binVal>)
{
int intensity = static_cast<int>(binVal*hpt / maxVal);//相对高度
line(histImg, Point(h*zoom, histSize*zoom),
Point(h*zoom, (histSize - intensity)*zoom),
Scalar(), zoom);
}
} return histImg;
}
}; int main()
{ Mat image = imread("1.jpg");
//判断是否为空
Histogram1D h;
//Mat histo = h.getHistogram(image);
Mat histo = h.getImageOfHistogram(image);
//namedWindow("Histogram");
//imshow("Histogram",histo);
//输出二值图像
Mat thresholded;
threshold(image, thresholded, ,//阈值
,//对超过域值的像素赋值
THRESH_BINARY);//阈值化类型 imshow("threshold", thresholded);
waitKey(); return ;
}
上面的程序是计算并画出单通下图像的直方图,主要就是calcHist函数。类似的可以定义一个计算彩色直方图的类。
class ColorHistgoram
{
private:
int histSize[];
float hranges[];
const float*ranges[];
int channels[];
public:
ColorHistgoram()
{
histSize[] = histSize[] = histSize[] = ;
hranges[] = ;
hranges[] = ; ranges[] = hranges;
ranges[] = hranges;
ranges[] = hranges; channels[] = ;
channels[] = ;
channels[] = ;
} Mat getHistogram(const Mat &image)
{
Mat hist; calcHist(&image,, channels, Mat(), hist, , histSize, ranges); return hist;
}
};
提高图像对比度
有两种方法,一是应用查找表来伸展直方图(有的强度值范围没有被利用),另一种是直方图均衡化(对所有可用的像素强度值都均衡使用)。
//查找表函数
static Mat applyLookUp(const Mat &image, const Mat &lookup)
{
Mat result;
LUT(image, lookup, result); return result;
} //通过查找表提高图像的对比度
Mat stretch(const Mat &image, int minValue = )
{
Mat hist = getHistogram(image); //找到直方图的左右限值
float imin;
for (imin=;imin < histSize[]; imin++)
{
//忽略数量较少的箱子
float x = hist.at<float>(imin);
if (x>minValue)
break;
}
int imax = histSize[] - ;
for (; imax >= ; imax--)
{
if (hist.at<float>(imax)>minValue)
break;
} //创建查找表
int dim();
Mat lookup(,//一维
&dim, CV_8U);
for (int i = ; i < ; i++)
{
//
if (i < imin)lookup.at<uchar>(i) = ;
else if (i>imax)lookup.at<uchar>(i) = ;
else
lookup.at<uchar>(i) = cvRound(255.0*(i - imin) / (imax - imin));
} Mat result;
result = applyLookUp(image, lookup); return result;
}
通过如下的函数可实现直方图均衡化。
//灰度图
equalizeHist(image, result);
Opencv Cookbook阅读笔记(四):用直方图统计像素的更多相关文章
- 论文阅读笔记四十三:DeeperLab: Single-Shot Image Parser(CVPR2019)
论文原址:https://arxiv.org/abs/1902.05093 github:https://github.com/lingtengqiu/Deeperlab-pytorch 摘要 本文提 ...
- 论文阅读笔记四:CTPN: Detecting Text in Natural Image with Connectionist Text Proposal Network(ECCV2016)
前面曾提到过CTPN,这里就学习一下,首先还是老套路,从论文学起吧.这里给出英文原文论文网址供大家阅读:https://arxiv.org/abs/1609.03605. CTPN,以前一直认为缩写一 ...
- 《大数据互联网大规模数据挖掘与分布式处理》阅读笔记(四)-----WEB广告
作者: 沈慧 目前,许多WEB应用通过广告而维持生计,从在线广告中获益最多的是搜索应用,“adwords”模型就是一种用于搜索查询和广告匹配的模型.这一章介绍了在线广告的相关问题.在线算法.Adwor ...
- 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包
1.压缩文件案的用途与技术 a.用途,简单来说,就是节约磁盘空间.如果从传输角度讲,占用宽带也会小很多(Apache就有自动压缩的功能,节省宽带资源,提升网站的输出能力) b.压缩技术 ...
- 论文阅读笔记四十九:ScratchDet: Training Single-Shot Object Detectors from Scratch(CVPR2019)
论文原址:https://arxiv.org/abs/1810.08425 github:https://github.com/KimSoybean/ScratchDet 摘要 当前较为流行的检测算法 ...
- 论文阅读笔记四十八:Bounding Box Regression with Uncertainty for Accurate Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1809.08545.pdf github:https://github.com/yihui-he/KL-Loss 摘要 大规模的目标检测数据集在 ...
- 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019)
论文原址:https://arxiv.org/abs/1903.00621 摘要 本文提出了基于无anchor机制的特征选择模块,是一个简单高效的单阶段组件,其可以结合特征金字塔嵌入到单阶段检测器中. ...
- 论文阅读笔记四十四:RetinaNet:Focal Loss for Dense Object Detection(ICCV2017)
论文原址:https://arxiv.org/abs/1708.02002 github代码:https://github.com/fizyr/keras-retinanet 摘要 目前,具有较高准确 ...
- 论文阅读笔记四十二:Going deeper with convolutions (Inception V1 CVPR2014 )
论文原址:https://arxiv.org/pdf/1409.4842.pdf 代码连接:https://github.com/titu1994/Inception-v4(包含v1,v2,v4) ...
随机推荐
- angular的工具方法笔记(equals, HashKey)
分别是angular脏值检测的工具方法equals和 类HashKey的使用方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi ...
- Web Service 小练习
对于网站与网站之间数据互动,这是我的说法,不是专家说的,不要相信.应该有专业的说法. 从他人的网站通过一个接口获取数据,这一直是我感到神奇的事,怎么实现的,一直萦绕于心,想要弄过究竟,怎么是实现的啊! ...
- 练习一_使用Git进行代码管理的心得
2015年9月19日,第一次软工实践课.助教给我们介绍了git,GitHub.显而易见,我并没有听懂.所以整个上午都在找教程,一个字一个字对着敲,然后敲着敲着就出错,回宿舍,继续敲,也是一样的... ...
- SSH框架整合配置所需JAR包(SSH整合)
转载于:http://www.cnblogs.com/kaige123/p/5719662.html Hibernate Jar: 1.hibernate3.jar,这个是hibernate3.0的核 ...
- 新建URL,cookie技术
假如用户禁止了cookie,怎么用session技术 //在这里访问一下session request.getSession(); //这里注意的是 要使用一下session while(iterat ...
- oracle-2-sql数据操作和查询
主要内容: >oracle 数据类型 >sql建表和约束 >sql对数九的增删改 >sql查询 >oracle伪例 1.oracle的数据类型 oracle数据库的核心是 ...
- poj1703 并查集
输入是2个不在一起的人,可以用一个数组来保存和他矛盾的人.这样find的时候就find(hash[]);就可以: #include<stdio.h> #include<string. ...
- 【codevs1257】 打砖块
http://codevs.cn/problem/1257/ (题目链接) 题意 在等腰三角形上打砖块,总共有m发炮弹,每块砖有一个权值,求打出的最大权值 Solution 今天考试题,考场上的2个小 ...
- 腾讯云ubuntu下mysqli服务的开启
腾讯云ubuntu下mysqli服务的开启 今天晚上搞了好久,在本地操作系统deepin下操作完全无需开启mysqli模块,自动就开启了.这次介绍一下服务器ubuntu下mysqli模块的开启. 首先 ...
- Serverlet程序
Serverlet是用Java编写的服务器端程序;主要用于交互地浏览和修改数据,生成动态Web内容; 一个serverlet就是一个继承于HttpServlet抽象类的Java类:下面先看一个简单的例 ...