1 直方图
直方图
:给出了一幅图像或一组图像中拥有给定数值的像素数量。灰度图图像(单通道)的直方图有256个条目。0号条目给出值为0的像素个数,1号条目给出值为1的像素个数…。当然直方图可以归一化,归一化后的所有条目之和等于1,每一个条目是该特定值像素在图像中所占的比例。大多数情况下,直方图是一个单通道或者三通道的图像。
直方图能够有效地描述图像的内容。既然能够有效的描述图像的内容,那么将图像化为直方图就能够做内容检测的工作。比如物体检测,相似度检测等。
2 calcHist函数
calcHist
函数是用来计算一个图像数组集合的直方图。
C++函数调用形式:
void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false)
Python调用形式:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) → hist
C调用形式:
void cvCalcHist(IplImage** image, CvHistogram* hist, int accumulate=0, const CvArr* mask=NULL)
参数说明:
images
— 源矩阵指针(输入图像,可以多张)。 但都应当有同样的深度(depth), 比如CV_8U 或者 CV_32F ,和同样的大小。每张图片可以拥有任意数量的通道。
nimages
— 源图像的数量,如一幅图像则为1。
channels
— 通道的数量,每个通道都有编号,灰度图为一通道,即channel[1]=0;对应着一维。BGR三通道图像编号为channels[3]={0,1,2};分别对应着第一维,第二维,第三维。
mask
— 掩码图像:要对图像处理时,先看看这个像素对应的掩码位是否为屏蔽,如果为屏蔽,就是说该像素不处理(掩码值为0的像素都将被忽略)
hist
— 返回的直方图。
dims
— 直方图维度。
histSize
— 直方图每一维的条目个数的数组,灰度图一维有256个条目。
ranges
— 每一维的像素值的范围,传递数组,与维数相对应,灰度图一维像素值范围为0~255。
3 获取直方图代码
3.1 单通道图像直方图
Histogram1D.h
#ifndef HISTOGRAM1D_H
#define HISTOGRAM1D_H
#include <iostream>
#include <QDebug>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;