21xrx.com
2024-12-22 13:04:57 Sunday
登录
文章检索 我的文章 写文章
C++绘制直方图
2023-07-09 04:58:37 深夜i     --     --
C++ 绘制 直方图 编程语言 数据可视化

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

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

以下是一些基本的步骤:

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


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

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

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


Mat hist;

int histSize = 256; 

float 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;

}

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

  
  

评论区

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