当前位置:   article > 正文

OpenCV2学习笔记(二):图像的直方图_yuv空间 clahe

yuv空间 clahe
    直方图(Histogram)又称质量分布图。是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。众所周知,一幅图像是由不同颜色值的像素组成,因此像素值在图像中的分布情况是这幅图像的一个重要特征,因此直方图广泛应用在数字图像处理中。
    拍照是现实生活中必不可少的一部分,由于环境亮度、图像拍摄过程中透视光圈设置错误等影响,经常会拍出一些“过暗”的照片,此时美图、PS等美化工具可以派上用场。但是这些工具的算法通常都是不公开的,鉴于研究所需,这里利用图像直方图的一些性质来探索一些图像增强方法。开发平台为OpenCV2.4.9+Qt5.3.2。
  • 1
  • 2

一、灰度图像的直方图
在一幅单通道的灰度图像中,每个像素的取值区间为[0,255],因此灰度图像的直方图包含256个容器,各个容器给出当前值的像素个数。简单来说,直方图统计出每种像素取值的个数,它可以被归一化,即算出图像的像素总数,然后将各容器的像素个数除去总数,归一化后所有项的和为1。
OpenCV中,使用cv::calcHist函数以计算直方图,这里创建一个Qt控制台应用并定义一个类(注意直方图中的数据类型为float):

histgram1d.h:

#ifndef HISTOGRAM1D_H
#define HISTOGRAM1D_H
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.hpp>

class Histogram1D
{
   
public:
    Histogram1D()
    {
        // 准备直方图的相关参数
        histSize[0] = 256;
        hranges[0] = 0.0; // 灰度值范围为0到255,float类型
        hranges[1] = 255.0;
        ranges[0] = hranges;
        channels[0] = 0;
    }
    cv::MatND getHistogram(const cv::Mat &image); // 计算灰度图像的直方图
    cv::Mat getHistogramImage(const cv::Mat &image); // 计算灰度直方图并返回图像

private:
    int histSize[1];  // 容器的数量
    float hranges[2]; // 像素的最小值和最大值
    const float *ranges[1]; 
    int channels[1];  // 仅使用一个通道
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

histgram1d.cpp:

#include "histogram1d.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.hpp>
#include <QDebug>
#include <opencv2/imgproc/imgproc.hpp>

cv::MatND Histogram1D::getHistogram(const cv::Mat &image)
{
    cv::MatND hist;
    cv::calcHist(&image,    // 输入图像
                 1,         // 计算1张图片的直方图
                 channels,  // 图像的通道数
                 cv::Mat(), // 不实用图像作为掩码
                 hist,      // 返回的直方图
                 1,         // 1D的直方图
                 histSize,  // 容器的数量
                 ranges);   // 像素值的范围
    return hist;
}

cv::Mat Histogram1D::getHistogramImage(const cv::Mat &image)
{
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/141037
推荐阅读
相关标签
  

闽ICP备14008679号