21xrx.com
2025-04-17 23:16:32 Thursday
文章检索 我的文章 写文章
C++绘制直方图
2023-07-09 04:58:37 深夜i     20     0
C++ 绘制 直方图 编程语言 数据可视化

C++是一门强大的编程语言,其广泛应用于各种领域,包括计算机视觉和图像处理。在图像处理中,直方图是一种重要的工具,可用于分析图像的颜色分布。本文将介绍如何使用C++编写一个简单的直方图绘制程序。

首先,我们需要安装一个适合的图像处理库。OpenCV是一种流行的开源计算机视觉库,可用于许多视觉任务,包括图像处理和分析。在本教程中,我们将使用OpenCV并展示如何绘制图像的灰度直方图。

以下是一些基本的步骤:

1. 读取图像文件:我们可以使用OpenCV中的函数imread()加载一个图像文件。代码如下:

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

其中,参数IMREAD_GRAYSCALE表示以灰度模式加载图像。

2. 计算直方图:使用OpenCV中的函数calcHist()对灰度图像进行直方图计算。代码如下:

Mat hist;
int histSize = 256float range[] = 0;
const float* histRange = {range};
calcHist(&img, 1, 0, Mat(), hist, 1, &histSize, &histRange, true, false);

这里的histSize表示直方图中bin(柱)的数量,将图像像素值的范围分为0到255,用256个bin表示。histRange表示像素值的范围。

3. 绘制直方图:使用OpenCV中的函数plotHist()来绘制直方图。代码如下:

int hist_w = 512; int hist_h = 400;
int bin_w = cvRound((double) hist_w/histSize);
Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0,0,0));
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
for(int i = 0; i < histSize; i++){
  rectangle(histImage, Point(bin_w*i, hist_h), Point(bin_w*i+bin_w-1, hist_h-cvRound(hist.at<float>(i))), Scalar(255,255,255), -1);
}

这里,我们创建一个空的Mat矩阵histImage,将它的大小设置为hist_h×hist_w大小。然后,我们使用normalize()函数将直方图数据归一化到histImage的行数。根据histSize的bin数循环,使用rectangle()函数在histImage上进行直方图绘制。

4. 显示直方图:最后,我们可以使用imshow和imwrite来显示直方图。

imshow("Histogram", histImage);
imwrite("histogram.jpg", histImage);

完整代码如下:

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

这个简单的直方图绘制程序可以用作进一步图像处理和分析的基础。相信通过上面的步骤,大家也可以自行尝试编写更加复杂的程序。

  
  

评论区

请求出错了