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) ...
随机推荐
- linux中的帮助命令
关键字 man --help help 1.man (1)查看命令 man 命令用来查看别的命令的信息和用法,如man ls表示查看ls的介绍以及用法: (2)查看配置文件的帮助文档 linux下的配 ...
- [设计模式] javascript 之 代理模式
代理模式说明 说明:顾名思义就是用一个类来代替另一个类来执行方法功能,这个模式跟装饰模式有点相似,不一样的是,代理模式是代替客户初始化被代理对象类,而装饰模式采用接口或初装饰者参数引用的方式来执行的. ...
- JS子父窗口互相取值赋值详解介绍
子窗口赋值到父窗口 代码如下 复制代码 <script>function openWin(str) { window.open(siteurl+"popup/"+ ...
- 日志框架对比 NLog VS Log4net
Log4net 先说Log4net,它是.net平台上一个老牌的日志框架,我接触的时间也不长(因为公司有自己的日志库),但是看着各开源库都在用这个于是前段时间也尝试去了解了一下. 首先让我认识到Log ...
- 【ZOJ 3870】 Team Formation
题意 n个数,找出有几对a.b 符合 a ^ b > max(a,b) .^表示异或号 分析 对于数a,如果它的二进制是: 1 0 1 0 0 1,那么和它 ^ 后 能比他大的数就是: 0 1 ...
- 关于mysql乱码的问题
ALTER TABLE TABLE_NAME CONVERT TO CHARACTER SET utf8 COLLATE UTF8_GENERAL_CI; 第一步,用mysql的自带修复工具在bin文 ...
- nginx&apache比较
1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx ...
- hdu 1013 Digital Roots
#include <stdio.h> int main(void) { int m,i;char n[10000]; while(scanf("%s",&n)= ...
- webform添加到webapi的支持
1.添加引用 添加对 System.Net.Http , System.Net.Http.Formatting , System.Web.Http , System.Web.Http.Common , ...
- iptable
http://blog.sina.com.cn/s/blog_6fbf7e670101d60i.html