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) ...
随机推荐
- 茗洋Easy UI 1.3.2 部分问题解决系列专题[Combo模糊匹配中文问题 修复]
本次给大家带来的EasyUI的我研究拓展的新特性 我使用的是 EasyUI 1.3.2版本的,项目是ASP.NET MVC3,但是本篇讲解用不上ASP.NET MVC,仅仅修改官方Demo你就知道怎 ...
- 北京大学信息科学技术学院计算机专业课程大纲选摘--JAVA
- tomcat配置和优化
转载: https://mp.weixin.qq.com/s?__biz=MzA3MzYwNjQ3NA==&mid=2651296654&idx=1&sn=b04fc6cecf ...
- c# 多线程 调用带参数函数
线程操作主要用到Thread类,他是定义在System.Threading.dll下.使用时需要添加这一个引用.该类提供给我们四个重载的构造函数(以下引自msdn). Thread (Pa ...
- 【BZOJ 3674】可持久化并查集加强版&【BZOJ 3673】可持久化并查集 by zky 用可持久化线段树破之
最后还是去掉异或顺手A了3673,,, 并查集其实就是fa数组,我们只需要维护这个fa数组,用可持久化线段树就行啦 1:判断是否属于同一集合,我加了路径压缩. 2:直接把跟的值指向root[k]的值破 ...
- Java常见异常
1. runtimeException子类: 1. java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常.当对数组的索引值为负数或大于等于数组大小时 ...
- sort+awk+uniq三者结合使用
(1)统计文件中出现次数最多的前10个单词 #ps -ef > ps.file #cat ps.file | awk ‘{print $1}’ | sort | uniq -c | sort - ...
- 修改Oracle权限的SQL及常见错误
1.在cmd命令中进入sqlplus:相应的在DOS命令下执行:(1)set ORACLE_SID = $INSTANCE_NAME(2)sqlplus /nolog(3)connect user/p ...
- LinkedHashMap实现LRU算法
LinkedHashMap特别有意思,它不仅仅是在HashMap上增加Entry的双向链接,它更能借助此特性实现保证Iterator迭代按照插入顺序(以insert模式创建LinkedHashMap) ...
- 【BZOJ-3172】单词 AC自动机
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2567 Solved: 1200[Submit][Status ...