21xrx.com
2024-06-03 00:03:07 Monday
登录
文章检索 我的文章 写文章
C++实现直方图
2023-07-04 20:28:25 深夜i     --     --
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库来读取、转换和操作图像,以及如何计算和显示直方图。直方图是数字图像处理中非常常用的分析方法,掌握这项技能对于任何从事图像处理的人都是非常重要的。

  
  

评论区

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