21xrx.com
2024-12-22 13:52:05 Sunday
登录
文章检索 我的文章 写文章
使用OpenCV绘制直方图函数
2023-10-22 07:21:48 深夜i     --     --
OpenCV 绘制 直方图 函数 图像处理

在图像处理和计算机视觉领域中,直方图是一种非常重要的工具。它能够帮助我们了解图像的像素分布情况,从而更好地理解图像的特征和内容。在OpenCV中,有一个方便的函数可以用于绘制直方图,即cv::calcHist()函数。

首先,我们需要导入OpenCV库,并读取一张图像。假设我们要绘制的直方图是灰度图像的直方图,那么我们可以使用以下代码:


#include <opencv2/opencv.hpp>

int main()

{

  // 读取灰度图像

  cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);

  // 初始化直方图参数

  int histSize = 256; // 直方图横轴的大小,表示灰度级别的个数

  float range[] = 0; // 像素值的范围

  const float* histRange = { range };

  // 计算直方图

  cv::Mat hist;

  cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);

  // 创建直方图画布

  int histWidth = 512, histHeight = 400;

  int binWidth = cvRound((double)histWidth / histSize);

  cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));

  // 归一化直方图数据

  cv::normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());

  // 绘制直方图

  for (int i = 0; i < histSize; i++)

  {

    int binHeight = cvRound(hist.at<float>(i) * histHeight / 255);

    cv::rectangle(histImage, cv::Point(i * binWidth, histHeight), cv::Point((i + 1) * binWidth, histHeight - binHeight),

      cv::Scalar(0, 0, 255), -1);

  }

  // 显示直方图

  cv::imshow("Histogram", histImage);

  cv::waitKey(0);

  return 0;

}

首先,我们通过cv::imread()函数读取一张灰度图像,并将其存储在名为`image`的`cv::Mat`对象中。接下来,我们定义了直方图的参数,如横轴大小、像素值范围等。

然后,我们使用cv::calcHist()函数计算直方图。这个函数接受几个参数,包括输入图像、图像数量、通道索引、掩模、输出直方图、直方图维度、直方图尺寸数组以及像素值范围数组。在本例中,我们使用灰度图像作为输入,并将直方图的维度设置为1,即一维直方图。

计算出直方图后,我们创建一个用于绘制直方图的画布。这个画布是一个大小为`histWidth×histHeight`的`CV_8UC3`类型的`cv::Mat`对象,颜色为黑色。

接下来,我们对直方图数据进行归一化操作,以便在绘制直方图时能够将其范围映射到画布上。

最后,我们使用一个循环来遍历直方图的每个灰度级别,并根据其值绘制一个矩形条到画布上。矩形条的高度根据归一化的直方图值来确定,宽度根据直方图横轴大小和灰度级别个数来计算。

最后,我们使用cv::imshow()函数显示出绘制好的直方图,并使用cv::waitKey()函数等待用户按下键盘按键后关闭窗口。

通过使用OpenCV的cv::calcHist()函数,我们可以轻松地计算和绘制图像的直方图,从而更好地理解图像的信息和特征。这在图像处理和计算机视觉任务中都非常有用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复