opencv calchist函数C++实现
时间: 2024-05-04 15:19:35 浏览: 165
以下是使用C++实现OpenCV中的calcHist函数的示例代码:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("test.jpg", IMREAD_GRAYSCALE); //读入灰度图像
if (image.empty()) //判断图像是否为空
{
cerr << "Failed to load image!" << endl;
return -1;
}
int histSize = 256; //直方图中bin的数量
float range[] = { 0, 256 }; //像素值范围
const float* histRange = { range };
bool uniform = true, accumulate = false;
Mat hist; //用于保存直方图的Mat
calcHist(&image, 1, 0, Mat(), hist, 1, &histSize, &histRange, uniform, accumulate); //计算直方图
int hist_w = 512, hist_h = 400; //直方图的宽和高
int bin_w = cvRound((double)hist_w / histSize); //每个bin的宽度
Mat histImage(hist_h, hist_w, CV_8UC1, Scalar(0)); //用于绘制直方图的Mat
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); //将直方图归一化到[0, histImage.rows]范围内
for (int i = 1; i < histSize; i++)
{
line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(hist.at<float>(i - 1))),
Point(i * bin_w, hist_h - cvRound(hist.at<float>(i))), Scalar(255), 2, LINE_AA); //在直方图上绘制每个bin的高度
}
imshow("Image", image);
imshow("Histogram", histImage);
waitKey(0);
return 0;
}
```
首先,使用`imread`函数读入灰度图像。然后,定义直方图的bin数量、像素值范围、是否均匀化、是否累加等参数,并创建一个用于保存直方图的Mat。接着,调用`calcHist`函数计算直方图。
计算完直方图后,定义用于绘制直方图的Mat,并将直方图归一化到[0, histImage.rows]范围内。最后,在直方图上绘制每个bin的高度,然后显示原始图像和直方图,等待用户按下任意键后程序结束。
阅读全文