赞
踩
直方图(Histogram)又称质量分布图。是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。众所周知,一幅图像是由不同颜色值的像素组成,因此像素值在图像中的分布情况是这幅图像的一个重要特征,因此直方图广泛应用在数字图像处理中。
拍照是现实生活中必不可少的一部分,由于环境亮度、图像拍摄过程中透视光圈设置错误等影响,经常会拍出一些“过暗”的照片,此时美图、PS等美化工具可以派上用场。但是这些工具的算法通常都是不公开的,鉴于研究所需,这里利用图像直方图的一些性质来探索一些图像增强方法。开发平台为OpenCV2.4.9+Qt5.3.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]; // 仅使用一个通道
};
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)
{
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。