直方图匹配opencv c++
时间: 2024-01-06 19:25:23 浏览: 220
直方图匹配是一种用于调整图像颜色分布的方法,使得两幅图像的直方图变得相似。在OpenCV中,可以使用`cv::equalizeHist()`函数来实现直方图均衡化,从而实现直方图匹配。
下面是一个使用OpenCV C++实现直方图匹配的示例代码:
```cpp
#include <opencv2/opencv.hpp>
int main()
{
// 读取输入图像
cv::Mat image = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
// 读取目标图像
cv::Mat target = cv::imread("target.jpg", cv::IMREAD_GRAYSCALE);
// 计算输入图像的直方图
cv::Mat hist;
cv::calcHist(&image, 1, 0, cv::Mat(), hist, 1, &histSize, &histRange);
// 计算目标图像的直方图
cv::Mat targetHist;
cv::calcHist(&target, 1, 0, cv::Mat(), targetHist, 1, &histSize, &histRange);
// 计算输入图像的累积直方图
cv::Mat cumHist;
cv::normalize(hist, cumHist, 0, 255, cv::NORM_MINMAX);
// 计算目标图像的累积直方图
cv::Mat targetCumHist;
cv::normalize(targetHist, targetCumHist, 0, 255, cv::NORM_MINMAX);
// 创建输出图像
cv::Mat result = cv::Mat::zeros(image.size(), image.type());
// 进行直方图匹配
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
int intensity = image.at<uchar>(i, j);
result.at<uchar>(i, j) = cv::saturate_cast<uchar>(targetCumHist.at<float>(intensity));
}
}
// 显示结果图像
cv::imshow("Result", result);
cv::waitKey(0);
return 0;
}
```
请注意,上述代码中的`input.jpg`和`target.jpg`分别代表输入图像和目标图像的文件名。你需要将代码中的这两个文件名替换为你自己的图像文件名。
阅读全文