灰度直方图的定义

灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。
#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阅读笔记(四):用直方图统计像素的更多相关文章

  1. 论文阅读笔记四十三:DeeperLab: Single-Shot Image Parser(CVPR2019)

    论文原址:https://arxiv.org/abs/1902.05093 github:https://github.com/lingtengqiu/Deeperlab-pytorch 摘要 本文提 ...

  2. 论文阅读笔记四:CTPN: Detecting Text in Natural Image with Connectionist Text Proposal Network(ECCV2016)

    前面曾提到过CTPN,这里就学习一下,首先还是老套路,从论文学起吧.这里给出英文原文论文网址供大家阅读:https://arxiv.org/abs/1609.03605. CTPN,以前一直认为缩写一 ...

  3. 《大数据互联网大规模数据挖掘与分布式处理》阅读笔记(四)-----WEB广告

    作者: 沈慧 目前,许多WEB应用通过广告而维持生计,从在线广告中获益最多的是搜索应用,“adwords”模型就是一种用于搜索查询和广告匹配的模型.这一章介绍了在线广告的相关问题.在线算法.Adwor ...

  4. 鸟哥的LINUX私房菜基础篇第三版 阅读笔记 四 档案的文件系统的压缩和打包

    1.压缩文件案的用途与技术     a.用途,简单来说,就是节约磁盘空间.如果从传输角度讲,占用宽带也会小很多(Apache就有自动压缩的功能,节省宽带资源,提升网站的输出能力)     b.压缩技术 ...

  5. 论文阅读笔记四十九:ScratchDet: Training Single-Shot Object Detectors from Scratch(CVPR2019)

    论文原址:https://arxiv.org/abs/1810.08425 github:https://github.com/KimSoybean/ScratchDet 摘要 当前较为流行的检测算法 ...

  6. 论文阅读笔记四十八: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 摘要 大规模的目标检测数据集在 ...

  7. 论文阅读笔记四十六:Feature Selective Anchor-Free Module for Single-Shot Object Detection(CVPR2019)

    论文原址:https://arxiv.org/abs/1903.00621 摘要 本文提出了基于无anchor机制的特征选择模块,是一个简单高效的单阶段组件,其可以结合特征金字塔嵌入到单阶段检测器中. ...

  8. 论文阅读笔记四十四:RetinaNet:Focal Loss for Dense Object Detection(ICCV2017)

    论文原址:https://arxiv.org/abs/1708.02002 github代码:https://github.com/fizyr/keras-retinanet 摘要 目前,具有较高准确 ...

  9. 论文阅读笔记四十二:Going deeper with convolutions (Inception V1 CVPR2014 )

    论文原址:https://arxiv.org/pdf/1409.4842.pdf 代码连接:https://github.com/titu1994/Inception-v4(包含v1,v2,v4)   ...

随机推荐

  1. [USACO2002][poj1947]Rebuilding Roads(树形dp)

    Rebuilding RoadsTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 8589 Accepted: 3854Descrip ...

  2. 第二十八课:focusin与focusout,submit,oninput事件的修复

    focusin与focusout 这两个事件是IE的私有实现,能冒泡,它代表获得焦点或失去焦点的事件.现在只有Firefox不支持focusin,focusout事件.其实另外两个事件focus和bl ...

  3. AngularJS开发指南13:AngularJS的过滤器详解

    AngularJS过滤器是用来格式化输出数据的.除了格式化数据,过滤器还能修改DOM.这使得过滤器通常用来做些如“适时的给输出加入CSS样式”等工作. 比如,你可能有些数据在输出之前需要根据进行本地化 ...

  4. Redis——分布式简单使用

    Redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis安装:参考博客http://www ...

  5. 用Random类输出验证码

    package dx; import java.text.DecimalFormat; import java.util.Random; public class DxL { //创建类 public ...

  6. "use strict"

    "use strict";//严格模式 <!doctype html> <html> <head> <meta charset=" ...

  7. Java算法-希尔排序

    希尔排序的诞生是由于插入排序在处理大规模数组的时候会遇到需要移动太多元素的问题.希尔排序的思想是将一个大的数组“分而治之”,划分为若干个小的数组,以 gap 来划分,比如数组 [1, 2, 3, 4, ...

  8. 【Gym 100947E】Qwerty78 Trip(组合数取模/费马小定理)

    从(1,1)到(n,m),每次向右或向下走一步,,不能经过(x,y),求走的方案数取模.可以经过(x,y)则相当于m+n步里面选n步必须向下走,方案数为 C((m−1)+(n−1),n−1) 再考虑其 ...

  9. Hamcrest

    Hamcrest比起JUnit的assert系列方法来,有更好的可读性,它按照参数从左到右的符合自然的顺序来展示,如actual is(notNullValue()),是对测试断言的改进.同时不会被哪 ...

  10. 让Jayrock插上翅膀(加入输入输出参数注释,测试页面有注释,下拉框可以搜索)

    继上一篇文章介绍了Jayrock组件开发接口的具体步骤和优缺点之后,今天给大家带来的就是,如何修复这些缺点. 首先来回顾一下修复的缺点有哪些: 1.每个接口的只能写大概的注释,不能分开来写,如接口的主 ...