在c++ opencv环境下帮我写一段代码,画出一幅彩色图像的直方图,要求从底层实现,尽量不要调用函数,帮我写成一个函数并且给出全部代码
时间: 2024-05-11 18:17:20 浏览: 124
opencv3/C++ 直方图反向投影实例
好的,我可以帮您写这段代码。以下是一个简单的函数,它可以计算彩色图像的直方图并返回一个Mat对象。
```c++
Mat calcHistogram(Mat image)
{
int histSize[] = {256, 256, 256};
float range[] = {0, 256};
const float* histRange[] = {range, range, range};
Mat hist(3, histSize, CV_32F, Scalar(0));
for (int i = 0; i < image.rows; i++) {
for (int j = 0; j < image.cols; j++) {
Vec3b pixel = image.at<Vec3b>(i, j);
hist.at<float>(pixel[0], pixel[1], pixel[2])++;
}
}
return hist;
}
```
该函数使用OpenCV的Mat类来表示图像和直方图。它使用一个三维数组来计算直方图,其中每个维度都有256个bin。在循环中,我们遍历图像的每个像素,并在相应的bin中增加计数值。最后,我们返回一个Mat对象,它包含计算出的直方图。
如果您想绘制直方图,您可以使用OpenCV的绘图函数。以下是一个简单的示例:
```c++
Mat image = imread("your_image.jpg");
Mat hist = calcHistogram(image);
// convert histogram to 2D array
Mat hist2d(256*256, 1, CV_32F);
int idx = 0;
for (int i = 0; i < 256; i++) {
for (int j = 0; j < 256; j++) {
for (int k = 0; k < 256; k++) {
hist2d.at<float>(idx++) = hist.at<float>(i, j, k);
}
}
}
// draw histogram
Mat histImage(256, 256, CV_8UC3, Scalar(0, 0, 0));
for (int i = 1; i < 256*256; i++) {
line(histImage, Point(i-1, 256-hist2d.at<float>(i-1)/100), Point(i, 256-hist2d.at<float>(i)/100), Scalar(255, 255, 255));
}
imshow("Histogram", histImage);
waitKey(0);
```
该示例将计算出的直方图转换为一个二维数组,并使用OpenCV的绘图函数绘制直方图。该示例中的代码假定每个bin的计数值都小于100,因此我们在绘制时将其缩小。您可以根据需要进行更改。
阅读全文