一.简介
在一个单通道的灰度图像中,每个像素的值介于0(黑色)~255(白色)之间,灰色图像的直方图有256个条目(或称为容器)
二.灰度直方图
图像由像素点构成,灰度直方图用来描述图像中各个灰度级的像素个数(该灰度级像素出现的频率),灰度直方图的横坐标表示灰度级,纵坐标表示图像中该灰度级出现的次数(频率)
对于灰度图像,其灰度阶256级变换范围为0~256
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)
#includeint main(){ // 图像源获取及判断 cv::Mat Image,ImageGray; Image = cv::imread("a.jpg"); if (Image.empty()) return -1; cv::imshow("Image", Image); // 转换为灰度图像 cv::cvtColor(Image, ImageGray, CV_BGR2GRAY); // 定义直方图参数 const int channels[1] = { 0}; const int histSize[1] = { 256}; float pranges[2] = { 0, 255}; const float* ranges[1] = {pranges}; cv::MatND hist; // 计算直方图 cv::calcHist(&ImageGray, 1, channels, cv::Mat(), hist, 1, histSize, ranges); // 初始化画布参数 int hist_w = 500; int hist_h = 500; int nHistSize = 255; // 区间 int bin_w = cvRound((double)hist_w / nHistSize); cv::Mat histImage(hist_w, hist_h, CV_8UC3, cv::Scalar(0, 0, 0)); // 将直方图归一化 normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat()); // 在直方图画布上画出直方图 for (int i = 1; i < nHistSize; i++) { line(histImage, cv::Point(bin_w * (i - 1),hist_h - cvRound(hist.at (i-1)) ), cv::Point(bin_w * (i), hist_h - cvRound(hist.at (i))), cv::Scalar(0, 0, 255), 2, 8, 0); } // 显示直方图 cv::imshow("histImage", histImage); cv::waitKey(0); return 0;}
三.H-S直方图
四.RGB直方图
五.自定义直方图
六.灰度直方图均衡
七.彩色直方图均衡
八.直方图变换查找
九.直方图变换累计
十.直方图匹配
十一.直方图对比
十二.直方图反向投影