opencv 饱和度矫正 c++代码
时间: 2023-07-24 11:33:44 浏览: 45
以下是使用 OpenCV 实现图像饱和度矫正的 C++ 代码示例:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 读取图像
Mat image = imread("input.jpg");
// 转换为 HSV 颜色空间
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
// 分离 Hue、Saturation、Value 通道
vector<Mat> channels;
split(hsv, channels);
Mat hue = channels[0];
Mat saturation = channels[1];
Mat value = channels[2];
// 计算 Value 的直方图
int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
bool uniform = true;
bool accumulate = false;
Mat valueHist;
calcHist(&value, 1, 0, Mat(), valueHist, 1, &histSize, &histRange, uniform, accumulate);
// 找到 Value 直方图的最大值和最小值
double minValue, maxValue;
minMaxLoc(valueHist, &minValue, &maxValue);
// 计算饱和度增益
float saturationGain = 1.0f / (1.0f - 0.5f * (1.0f - maxValue / 255.0f));
// 应用饱和度增益
saturation.convertTo(saturation, -1, saturationGain, 0);
// 合并 Hue、Saturation、Value 通道
merge(channels, hsv);
// 转回 BGR 颜色空间
Mat result;
cvtColor(hsv, result, COLOR_HSV2BGR);
// 显示结果
imshow("input", image);
imshow("output", result);
waitKey();
return 0;
}
```
以上代码首先读取图像,然后将其转换为 HSV 颜色空间,并分离出 Hue、Saturation、Value 三个通道。接着计算 Value 通道的直方图,并找到其最大值和最小值,从而计算出饱和度增益。最后将 Saturation 通道应用饱和度增益,合并三个通道,转回 BGR 颜色空间,并显示结果。