OpenCV绘制图像灰度曲线
时间: 2023-05-29 17:02:24 浏览: 334
OpenCV提供了绘制图像灰度曲线的函数cv::calcHist()和cv::plotHistogram()。以下是一个示例代码,展示如何使用这两个函数来绘制图像的灰度曲线。
```c++
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE); // 读取灰度图像
cv::Mat hist; // 声明直方图
int histSize[] = {256}; // 直方图的大小
float gray_range[] = {0, 256}; // 灰度值范围
const float* histRange[] = {gray_range};
cv::calcHist(&src, 1, 0, cv::Mat(), hist, 1, histSize, histRange); // 计算直方图
int hist_w = 512, hist_h = 400;
int bin_w = cvRound((double)hist_w / 256);
cv::Mat histImage(hist_h, hist_w, CV_8UC3, cv::Scalar(0, 0, 0)); // 画布
cv::normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat()); // 归一化
for (int i = 1; i < 256; i++)
{
cv::line(histImage, cv::Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
cv::Point(bin_w * i, hist_h - cvRound(hist.at<float>(i))), cv::Scalar(255, 255, 255), 2, 8, 0);
}
cv::imshow("Gray Histogram", histImage);
cv::waitKey();
return 0;
}
```
首先使用cv::imread()读取灰度图像,然后使用cv::calcHist()计算其灰度直方图。通过设置直方图的大小和灰度值范围,我们可以得到256个bin的灰度直方图。
然后,我们创建一个尺寸为512x400的画布,使用cv::normalize()将灰度直方图归一化到[0, 400]的范围内。使用bin_w = cvRound((double)hist_w / 256)计算每个bin的宽度,并使用cv::line()在画布上绘制直方图的线条。
最后,使用cv::imshow()显示绘制的灰度曲线,并使用cv::waitKey()等待按键,直到用户按下键盘上的某个键退出程序。
阅读全文