c++ 实现matlab 中的histogram
时间: 2024-04-22 22:24:35 浏览: 168
要在C++中实现类似于Matlab中的直方图,你可以使用第三方库如OpenCV来完成。以下是一个使用OpenCV的示例代码:
```cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
// 检查图像是否成功加载
if (image.empty()) {
std::cout << "无法读取图像文件" << std::endl;
return -1;
}
// 定义直方图参数
int histSize = 256; // 直方图的bin数量
float range[] = { 0, 256 }; // 像素值范围
const float* histRange = { range };
// 计算直方图
cv::Mat histogram;
cv::calcHist(&image, 1, nullptr, cv::Mat(), histogram, 1, &histSize, &histRange);
// 创建画布
int histWidth = 512, histHeight = 400;
int binWidth = cvRound((double)histWidth / histSize);
cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));
// 归一化直方图数据
cv::normalize(histogram, histogram, 0, histImage.rows, cv::NORM_MINMAX);
// 绘制直方图
for (int i = 1; i < histSize; i++) {
cv::line(histImage, cv::Point(binWidth * (i - 1), histHeight - cvRound(histogram.at<float>(i - 1))),
cv::Point(binWidth * (i), histHeight - cvRound(histogram.at<float>(i))),
cv::Scalar(255, 255, 255), 2, 8, 0);
}
// 显示图像和直方图
cv::imshow("Image", image);
cv::imshow("Histogram", histImage);
cv::waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取了一张灰度图像。然后,我们使用`calcHist`函数计算图像的直方图。接下来,我们创建了一个画布来绘制直方图,并使用`normalize`函数将直方图数据归一化到画布的高度范围内。最后,我们使用`line`函数在画布上绘制直方图。
请注意,这个示例假设你已经安装了OpenCV库,并且将图像文件命名为"image.jpg"放在同一目录下。你需要根据自己的实际情况进行相应的调整。
希望这个示例能帮到你!如果你有任何问题,请随时提问。
阅读全文