C和opencv实现图像显示图像的紫色的直方图,使用IplImage
时间: 2023-05-30 08:05:14 浏览: 135
基于OpenCV的颜色直方图
5星 · 资源好评率100%
以下是使用C和OpenCV实现图像显示图像紫色直方图的示例代码:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
if (argc != 2)
{
cout << "Usage: display_image ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
image = imread(argv[1], IMREAD_COLOR);
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
namedWindow("Original Image", WINDOW_AUTOSIZE);
imshow("Original Image", image);
Mat hsv_image;
cvtColor(image, hsv_image, COLOR_BGR2HSV);
int hbins = 256, sbins = 256;
int histSize[] = { hbins, sbins };
float hranges[] = { 0, 180 };
float sranges[] = { 0, 256 };
const float* ranges[] = { hranges, sranges };
MatND hist;
int channels[] = { 0, 1 };
calcHist(&hsv_image, 1, channels, Mat(), hist, 2, histSize, ranges, true, false);
double maxVal = 0;
minMaxLoc(hist, 0, &maxVal, 0, 0);
int scale = 10;
Mat histImg = Mat::zeros(sbins*scale, hbins * 10, CV_8UC3);
for (int h = 0; h < hbins; h++)
{
for (int s = 0; s < sbins; s++)
{
float binVal = hist.at<float>(h, s);
int intensity = cvRound(binVal * 255 / maxVal);
rectangle(histImg, Point(h*scale, s*scale), Point((h + 1)*scale - 1, (s + 1)*scale - 1), Scalar::all(intensity), FILLED);
}
}
namedWindow("Histogram", WINDOW_AUTOSIZE);
imshow("Histogram", histImg);
waitKey(0);
return 0;
}
```
代码执行的步骤如下:
1. 读取图像并显示原始图像。
2. 将图像从BGR颜色空间转换为HSV颜色空间。
3. 计算HSV图像的直方图。
4. 创建直方图图像并绘制直方图。
5. 显示直方图图像。
在这个示例中,我们使用了OpenCV的calcHist函数来计算直方图,并使用Mat类的at函数来访问直方图中的每个元素。我们还使用了OpenCV的rectangle函数来绘制直方图。最后,我们使用imshow函数来显示原始图像和直方图图像。
请注意,这个示例中的直方图是在HSV颜色空间中计算的,因此它只显示了紫色的直方图。如果你想在RGB颜色空间中计算直方图或显示其他颜色的直方图,你需要相应地调整代码。
阅读全文