给我一段完整的代码,利用VS+opencv实现打开一张图片,对打开的图片进行直方图均衡,显示均衡前后的直方图
时间: 2024-02-27 22:55:28 浏览: 24
好的,以下是一份利用 VS 和 OpenCV 实现的直方图均衡化代码,可以打开一张图片并进行直方图均衡,最后显示均衡前后的直方图:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
if (argc != 2)
{
cout << " Usage: ./histogram_equalization <image_path>" << endl;
return -1;
}
// 读取图片
Mat image = imread(argv[1], IMREAD_GRAYSCALE);
if (image.empty())
{
cout << "Could not open or find the image" << endl;
return -1;
}
// 对图片进行直方图均衡
Mat equalized_image;
equalizeHist(image, equalized_image);
// 计算均衡前后的直方图
int hist_size = 256;
float range[] = { 0, 256 };
const float* hist_range = { range };
Mat hist, equalized_hist;
calcHist(&image, 1, 0, Mat(), hist, 1, &hist_size, &hist_range);
calcHist(&equalized_image, 1, 0, Mat(), equalized_hist, 1, &hist_size, &hist_range);
// 显示均衡前后的图片和直方图
namedWindow("Original Image", WINDOW_AUTOSIZE);
namedWindow("Equalized Image", WINDOW_AUTOSIZE);
namedWindow("Original Histogram", WINDOW_AUTOSIZE);
namedWindow("Equalized Histogram", WINDOW_AUTOSIZE);
imshow("Original Image", image);
imshow("Equalized Image", equalized_image);
plotHistogram(hist, "Original Histogram");
plotHistogram(equalized_hist, "Equalized Histogram");
waitKey(0);
return 0;
}
void plotHistogram(Mat& hist, const string& title)
{
int hist_size = hist.rows;
double max_val = 0;
minMaxLoc(hist, 0, &max_val, 0, 0);
int width = 512;
int height = 400;
int bin_width = width / hist_size;
Mat hist_image(height, width, CV_8UC1, Scalar(255, 255, 255));
for (int i = 0; i < hist_size; i++)
{
float bin_val = hist.at<float>(i);
int intensity = cvRound(bin_val * height / max_val);
rectangle(hist_image, Point(i * bin_width, height - 1), Point((i + 1) * bin_width - 1, height - intensity), Scalar(0, 0, 0));
}
namedWindow(title, WINDOW_AUTOSIZE);
imshow(title, hist_image);
}
```
需要注意的是,这个程序需要使用 OpenCV 库,所以需要在项目中添加 OpenCV 库的链接。