21xrx.com
2025-04-02 07:22:08 Wednesday
文章检索 我的文章 写文章
C++实现直方图
2023-07-04 20:28:25 深夜i     14     0
C++ 直方图 实现

直方图是数字图像处理中一种常用的图像分析方法,它可以以图形方式展示图像像素值的分布情况。通过对直方图的分析可以得到图像的许多信息,比如图像的对比度、亮度、灰度差异等。本篇文章介绍了如何使用C++语言实现直方图。

首先,我们需要读取图像并将其转换为灰度图像。灰度图像表示了原始彩色图像的亮度信息。我们可以使用OpenCV库中的函数来读取和转换图像。

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
  Mat image = imread("test.jpg");
  cvtColor(image, image, COLOR_BGR2GRAY);
  imshow("Gray Image", image);
  waitKey(0);
  return 0;
}

接下来,我们需要计算图像中像素值的分布情况,并把它们显示在直方图中。我们可以使用OpenCV库中的函数cv::calcHist()来计算直方图。这个函数需要输入的参数包括:输入图像、通道数、直方图大小、像素值范围,以及一个变量来存储直方图数据。在计算直方图后,我们可以使用OpenCV库中的函数cv::normalize()来将直方图数据归一化,并把它们显示在直方图中。

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
  Mat image = imread("test.jpg");
  cvtColor(image, image, COLOR_BGR2GRAY);
  int histSize[] = { 256 };
  float range[] = 255 ;
  const float* histRange[] = { range };
  Mat hist;
  calcHist(&image, 1, 0, Mat(), hist, 1, histSize, histRange);
  int hist_w = 512, hist_h = 400;
  int bin_w = cvRound((double)hist_w / histSize[0]);
  Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));
  normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
  for (int i = 1; i < histSize[0]; i++)
  {
    line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
      Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))),
      Scalar(255, 0, 0), 2, 8, 0);
  }
  imshow("Histogram", histImage);
  waitKey(0);
  return 0;
}

在上面的代码中,我们首先定义了直方图的大小为256,即我们将所有可能的像素值都包括在内。然后我们通过调用cv::calcHist()函数计算直方图,并将结果存储在一个Mat变量hist中。接下来,我们定义了一个用于显示直方图的图像histImage,并使用cv::normalize()函数将直方图归一化。最后,我们使用cv::line()函数在图像上绘制直方图。

最后,我们编译并运行上述代码。在运行过程中,我们将看到输入图像的灰度版本和其对应的直方图。

本篇文章介绍了如何使用C++语言实现直方图。通过这个示例,我们可以了解到如何使用OpenCV库来读取、转换和操作图像,以及如何计算和显示直方图。直方图是数字图像处理中非常常用的分析方法,掌握这项技能对于任何从事图像处理的人都是非常重要的。

  
  

评论区

请求出错了