1、首先计算出一幅图像的直方图

//计算直方图
cv::MatND ImageHist::getHist(const cv::Mat &image){ cv::Mat im;
if(image.channels() == 3)
cv::cvtColor(image,im,CV_RGB2GRAY,0);
else
im = image;
float r[2];
r[0] = 0;
r[1] = 255;
const float *ranges[1];
ranges[0] = r;
cv::calcHist(&im,
1,
&channels,
cv::Mat(),
hist,
1,
&histSize,
ranges);
return hist;
} //将直方图生成图像,以便在MFC空间中显示
cv::Mat ImageHist::getHistImage(const cv::Mat &image){ double maxVal = 0;
double minVal = 0;
cv::minMaxLoc(hist,&minVal,&maxVal,0,0);
cv::Mat histImg(histSize,histSize,CV_8U,cv::Scalar(255)); int high = histSize * 0.9;
for (int i = 0;i < histSize;++i)
{
float binVal = hist.at<float>(i);
int inted = binVal / maxVal *high;
cv::line(histImg,
cv::Point(i,histSize),
cv::Point(i,histSize - inted),
cv::Scalar::all(0));
}
return histImg;
}

2、去掉直方图两端bin为0或者小于某一数量的bin并记录去掉后两端的灰度值(mini,maxi),然后利用以下公式对颜色查找表进行拉伸:

(i - mini) * 255 / (maxi - mini) + 0.5
cv::Mat ImageHist::stretch(const cv::Mat &image,int minValue /* = 0 */){
int mini = 0;
for (;mini < histSize;++mini)
{
if(hist.at<float>(mini) > minValue)
break;
}
int maxi = histSize - 1;
for (;maxi >= 0;--maxi)
{
if(hist.at<float>(maxi) > minValue)
break;
} cv::Mat lookup(1,256,CV_8U);
for (int i = 0;i < histSize;++i)
{
if(i < mini)
lookup.at<uchar>(i) = 0;
else if(i > maxi)
lookup.at<uchar>(i) = 255;
else
lookup.at<uchar>(i) =static_cast<uchar>((i - mini) * 255 / (maxi - mini) + 0.5);
}
cv::Mat result;
cv::LUT(image,lookup,result);
return result;
}

结果:

opencv直方图拉伸的更多相关文章

  1. OpenCV实现灰度直方图和直方图拉伸

    原文链接:http://blog.csdn.net/xiaowei_cqu/article/details/7600666 如有疑问或者版权问题,请移步原作者或者告知本人. 灰度直方图是数字图像中最简 ...

  2. opencv 直方图

    1.简介 对输入图像进行直方图均衡化处理,提升后续对象检测的准确率在OpenCV人脸检测的代码演示中已经很常见.此外对医学影像图像与卫星遥感图像也经常通过直方图均衡化来提升图像质量. 图像直方图均衡化 ...

  3. openCV 直方图统计

    直方图显示 #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc ...

  4. OPENCV直方图与匹配

    直方图可以用来描述不同的参数和事物,如物体的色彩分布,物体的边缘梯度模版以及目标位置的当前假设的概率分布. 直方图就是对数据进行统计的一种方法,并且将统计值定义到一系列定义好的bin(组距)中,获得一 ...

  5. OpenCV——直方图均衡化(用于图像增强)

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  6. opencv:直方图操作

    示例程序: #include <opencv.hpp> using namespace cv; using namespace std; int main() { Mat src, dst ...

  7. opencv直方图该怎么画

    图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...

  8. OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)

    1 直方图 灰度级范围为 \([0,L-1]\) 的数字图像的直方图是离散函数 \(h(r_k) = n_k\) , 其中 \(r_k\) 是第\(k\)级灰度值,\(n_k\) 是图像中灰度为 \( ...

  9. opencv直方图均衡化

    #include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...

随机推荐

  1. Memcache 分布式高可用集群介绍

    分布式缓存需考虑如下三点: 1.缓存本身的水平线性扩展的问题. 2.缓存大病罚下的本身性能问题. 3.避免缓存的单点鼓掌问题. 分布式缓存存在的问题: 1.内存本身的管理问题.内存的分配,管理和回收机 ...

  2. deeplearningbook-chinese

    https://exacity.github.io/deeplearningbook-chinese/

  3. 如何调整word中表格某一列占半分比

    1.可以拖动,但是不准确 2.

  4. Revit Family API 添加几何实体

    先创建一个封闭曲线createProfileLShape();再创建实体,这里需要手工画一个参考平面; ; i < nVerts; ++i)        {            Line l ...

  5. Maven 使用了一个标准的目录结构和一个默认的构建生命周期。

    Maven 使用了一个标准的目录结构和一个默认的构建生命周期. 约定优于配置 当创建 Maven 工程时,Maven 会创建默认的工程结构.开发者只需要合理的放置文件,而在 pom.xml 中不再需要 ...

  6. Iphone控件大全

    Iphone的常用控件有哪些?看看下面 一 视图UIView和UIWindow iphone视图的规则是:一个窗口,多个视图.UIWindow相当于电视机,UIViews相当于演员. 1.显示数据的视 ...

  7. iOS-如何让xcode自动检查内存泄露

    在project-setting中找到 “Run Static Analyzer” 键,然后把值修改为“YES”.这样在编码的时候,xcode就可以自动为我们检查内存泄露了.

  8. EM算法与混合高斯模型

    非常早就想看看EM算法,这个算法在HMM(隐马尔科夫模型)得到非常好的应用.这个算法公式太多就手写了这部分主体部分. 好的參考博客:最大似然预计到EM,讲了详细样例通熟易懂. JerryLead博客非 ...

  9. springMVC中HTTP PUT请求该如何传输请求参数呢?

    对于表单提交,tomcat默认只解析POST的表单,对于PUT和DELETE的不处理,所以Spring拿不到.解决方案:1.修改tomcat的server.xml:   <Connector p ...

  10. Android性能检测工具——traceview

    之前的几篇文章中介绍了android中常用的一些工具,今天介绍的工具也是比较实用和方便的,它可以用量化的指标告诉我们哪个方法执行的时间最长,被调用的次数最多,有没有重复调用.下面我们就来看看它是怎么为 ...