灰度图像直方图变换的一些代码

经常,我们要对灰度图像做一些灰度变换。比如增强对比度一类的。openCV 没有直接提供函数来处理。需要我们写一点代码。这里就贴几个我经常用到的代码片段。

今天的代码中用到了些以前写的代码的功能。具体的可以参考:

http://blog.csdn.net/liyuanbhu/article/details/50708912

首先是直方图正规化。所谓直方图正规化,就是将图像中最暗的地方的亮度设为 0, 最亮的地方的亮度设为 255,其他的地方的亮度线性映射。

cv::Mat Histogram1D::normalize(const cv::Mat &image)
{
    // Compute histogram first
    cv::MatND hist = getHistogram(image);
    int imin, imax;
    for(imin = 0; imin < histSize[0]; imin++)
    {
        if(hist.at<float>(imin) > 0) break;
    }

    for(imax = histSize[0] - 1; imax >= 0; imax--)
    {
        if(hist.at<float>(imax) > 0) break;
    }

    cv::Mat lookup(1, 256, CV_8U);

    for(int i = 0; i < 256; i++)
    {
        if(i < imin) lookup.at<uchar>(i) = 0;
        else if(i > imax) lookup.at<uchar>(i) = 255;
        else
        {
            int v = 255 * (i - imin) / (imax - imin);
            lookup.at<uchar>(i) = static_cast<uchar>(v);
        }
    }
    cv::Mat ret;
    cv::LUT(image, lookup, ret);
    return ret;
}

然后是图像增强的一种常见方法。灰度值拉伸。简单的说就是舍弃亮度直方图中最亮和最暗的一小部分,将其余的部分拉伸到 0 到 255。

下面是代码:

cv::Mat Histogram1D::stretch(const cv::Mat &image, double percent1, double percent2)
{

    cv::MatND hist = getHistogram(image);
    int imin, imax;
    if(percent1 < 0.0) percent1 = 0.0;
    if(percent1 > 1.0) percent1 = 1.0;
    percent1 = image.rows * image.cols * percent1;
    double value = 0;
    for(imin = 0; imin < histSize[0]; imin++)
    {
        value += hist.at<float>(imin);
        if(value > percent1) break;
    }

    value = 0;
    if(percent2 < 0.0) percent2 = 0.0;
    if(percent2 > 1.0) percent2 = 1.0;
    percent2 = image.rows * image.cols * percent2;
    for(imax = histSize[0] - 1; imax >= 0; imax--)
    {
        value += hist.at<float>(imax);
        if(value > percent2) break;
    }
    //int dim = 256;
    cv::Mat lookup(1, 256, CV_8U);

    for(int i = 0; i < 256; i++)
    {
        if(i < imin) lookup.at<uchar>(i) = 0;
        else if(i > imax) lookup.at<uchar>(i) = 255;
        else
        {
            int v = 255 * (i - imin) / (imax - imin);
            lookup.at<uchar>(i) = static_cast<uchar>(v);
        }
    }
    cv::Mat ret;
    cv::LUT(image, lookup, ret);
    return ret;
}
cv::Mat Histogram1D::stretch(const cv::Mat &image, double percent)
{
    return stretch(image, percent, percent);
}

代码都非常简答,就不多解释了。

时间: 2024-12-21 10:45:24

灰度图像直方图变换的一些代码的相关文章

【图像处理】利用C++编写函数,绘制灰度图像直方图

1. 简介 利用OpenCV读取图像,转换为灰度图像,绘制该灰度图像直方图.点击直方图,控制台输出该灰度级像素个数. 2. 原理 (1) 实现原理较为简单,主要利用了OpenCV读取图像,并转换为灰度图像: srcImg = imread(" ......"); // “....” 代表图像地址 if (srcImg.empty()) { return -1; } imshow(WINDOW_SRCIMG, srcImg); Mat grayImg; cvtColor(srcImg,

灰度图像--图像增强 直方图均衡化(Histogram equalization)

学习DIP第38天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

matlab 直方图均衡化

原理: 直方图均衡化首先是一种灰度级变换的方法: 原来的灰度范围[r0,rk]变换到[s0,sk]变换函数为:s=T(r); 为便于实现,可以用查找表(look-up table)的方式存储,即:原始的灰度作为查找表的索引,表中的内容是新的灰度值. 其次,直方图均衡化是图像增强的一种基本方法,可提高图像的对比度,即:将较窄的图像灰度范围以一定规则拉伸至较大(整个灰度级范围内)的范围. 目的是在得到在整个灰度级范围内具有均匀分布的图像. 所以,当输入:直方图H(r)[此处指每个灰度级占有的像素数]

图像直方图与直方图均衡化

图像直方图与直方图均衡化 图像直方图以及灰度与彩色图像的直方图均衡化 图像直方图: 概述: 图像的直方图用来表征该图像像素值的分布情况.用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目. 图像直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度范围为[0~255]之间,对于RGB的彩色图像可以独立显示三种颜色的图像直方图. 同时直方图是用来寻找灰度图像二值化阈值常用而且是有效的手段之一,如果一幅灰度图像的直方图显示为两个波

C#数字图像处理算法学习笔记(二)--点运算与直方图

C#数字图像处理算法学习笔记(二)--点运算与直方图 在数字图像处理中,点运算是一种简单而重要的技术.点运算只是根据对象的像素的输入灰度值来决定像素的输出灰度值的图像处理运算.它有时也被称为对比度增强.对比度拉伸或灰度变换.点运算没有改变图像的空间运算,它是按照一定的方式改变了图像的灰度直方图. 灰度直方图是一种最简单且最有用的工具,它概括了一幅图像的灰度级内容. 灰度直方图的定义: 灰度直方图是灰度的函数,描述的是图像中的具有该灰度级的像素个数.如果用直角坐标系来表示,则它的横坐标是灰度级,纵

彩色图像与灰度图像之间的转换

一.彩色图像简介 在RGB色彩空间,图像深度与色彩的映射关系主要有真彩色.伪彩色和调配色. 真彩色是指在组成一幅彩色图像的每个像素值中,有R,G,B三个基色分量,每个基色分量直接决定显示设备的基色强度,这样产生的彩色称为真彩色,是真实的原图彩色. 伪彩色图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT中某一项的入口地址,根据该地址可查找出包含实际R,G,B的强度值.这种用查找映射的方法产生的色彩称为伪彩色.色彩查找表CLUT是一个事先做好的表,表项入口地址也称为索引号.彩

MATLAB数字图像处理(一)基础操作和傅立叶变换

数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中,遥感领域中,对于影像数据的处理均基于数字图像处理的技术.而遥感影像数据作为地理信息科学的重要数据源,如何从中获取有用的信息,是地理信息数据处理中重要的内容. MATLAB作为数学领域应用最广泛的一种软件,集成了对于图片处理的函数和功能,成为了处理数字图像问题的佼佼者.其出众的计算能力和简便的绘图能

关于统计变换(CT/MCT/RMCT)算法的学习和实现

原文地址http://blog.sina.com.cn/s/blog_684c8d630100turx.html 刚开会每周的例会,最讨厌开会了,不过为了能顺利毕业,只能忍了.闲话不多说了,下面把上周学习的一个简单的算法总结一下,以备后面写毕业论文的时候可以参考一下. 一.Census Transform(CT)算法的学习 Census Transform 算法是Ramin Zabih 和 John Woodfill 于1994年在他们的论文<Non-parametric LocalTransf

【zz】matlab 直方图匹配

原文地址:http://www.cnblogs.com/tiandsp/archive/2012/12/19/2825418.html 直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的直方图加以映射,使新图像的直方图的分布类似于给定的函数. 总共有以下几步: 1.求给定的函数的累积直方图s. 2.求原图像的累积直方图G. 3.求s中每一个值在G中距离最小的位置index. 4.求原图像每个像素通过index映射到的新像素的值. 代码如下: clear all; close all