在一個單通道的灰度圖像中,每一個像素的值介於0(黑色)~255(白色)之間,灰色圖像的直方圖有256個條目(或稱爲容器)spa
圖像由像素點構成,灰度直方圖用來描述圖像中各個灰度級的像素個數(該灰度級像素出現的頻率),灰度直方圖的橫座標表示灰度級,縱座標表示圖像中該灰度級出現的次數(頻率)code
對於灰度圖像,其灰度階256級變換範圍爲0~256orm
void calcHist(blog
const Mat* images,it
int nimages,opencv
const int* channels,form
InputArray mask,class
OutputArray hist,容器
int dims,channel
const int* histSize,
const float** ranges,
bool uniform = true,
bool accumulate = false)
#include <opencv2\opencv.hpp> int 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<float>(i-1)) ), cv::Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))), cv::Scalar(0, 0, 255), 2, 8, 0); } // 顯示直方圖 cv::imshow("histImage", histImage); cv::waitKey(0); return 0; }