用OpenCV和C++绘制图像的灰度曲线
时间: 2023-05-29 16:02:35 浏览: 320
以下是使用OpenCV和C绘制图像的灰度曲线的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
bool uniform = true, accumulate = false;
Mat hist, histImage;
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);
histImage = Mat(hist_h, hist_w, CV_8UC1, Scalar(255, 255, 255));
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
for (int i = 1; i < histSize; i++)
{
line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(hist.at<float>(i - 1))),
Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))),
Scalar(0, 0, 0), 2, 8, 0);
}
namedWindow("灰度曲线", WINDOW_AUTOSIZE);
imshow("灰度曲线", histImage);
waitKey(0);
return 0;
}
```
在这个示例代码中,首先导入了OpenCV和标准库头文件。然后,通过使用imread函数,将一张灰度图像读入到Mat对象中。
接下来,声明了绘制图像的一些基本参数,例如直方图的大小等等,并使用calcHist函数计算图像的直方图。
然后,定义了直方图绘制的一些属性,如绘制区域大小和每个bin的宽度等等。使用Mat类创建histImage对象,初始化为白色背景。
使用normalize函数对直方图进行归一化处理,以便将其绘制到histImage对象中。最后,使用for循环遍历每个bin,并绘制灰度曲线。
最后,创建一个窗口并将histImage对象的图像显示在其中,等待用户的任意按键触发终止程序的执行。
阅读全文