【C++】OpenCV常用对比度增强方法
在 OpenCV 中,常用的 C++ 对比度增强方法有以下几种,附示例代码:
1. 线性变换(αβ 调整)
最常用的方法,通过线性变换增强对比度:
#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg");Mat dst;double alpha = 1.5; // 对比度增益(>1 增强对比度)int beta = 10; // 亮度偏移src.convertTo(dst, -1, alpha, beta);imwrite("output_linear.jpg", dst);return 0;
}
公式:
g(i,j) = α * f(i,j) + β
,其中 α 控制对比度,β 控制亮度。
2. 直方图均衡化(全局增强)
适用于灰度图像:
#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg", IMREAD_GRAYSCALE);Mat dst;equalizeHist(src, dst);imwrite("output_hist.jpg", dst);return 0;
}
彩色图像需分通道处理:
Mat channels[3];
split(src, channels);
for (int i = 0; i < 3; i++) {equalizeHist(channels[i], channels[i]);
}
merge(channels, 3, dst);
imwrite("output_hist_color.jpg", dst);
3. 对比度拉伸(归一化到 0-255)
通过 normalize
实现:
#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg");Mat dst;normalize(src, dst, 0, 255, NORM_MINMAX);imwrite("output_normalize.jpg", dst);return 0;
}
4. CLAHE(自适应直方图均衡化)
针对局部对比度增强:
#include <opencv2/opencv.hpp>
using namespace cv;int main() {Mat src = imread("input.jpg", IMREAD_GRAYSCALE);Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8, 8));Mat dst;clahe->apply(src, dst);imwrite("output_clahe.jpg", dst);return 0;
}
5. Gamma 校正(非线性增强)
适合低对比度、偏亮图像:
#include <opencv2/opencv.hpp>
#include <cmath>
using namespace cv;int main() {Mat src = imread("input.jpg");Mat dst;double gamma = 2.2;Mat table(1, 256, CV_8U);for (int i = 0; i < 256; i++)table.at<uchar>(i) = saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);LUT(src, table, dst);imwrite("output_gamma.jpg", dst);return 0;
}
总结对比
方法 | 适用场景 | 特点 |
---|---|---|
αβ 调整 | 通用 | 简单、快速 |
直方图均衡化 | 低对比度 | 全局增强,可能过曝 |
CLAHE | 局部对比度增强 | 避免过曝,细节清晰 |
Gamma 校正 | 亮度非线性调整 | 适合偏亮/偏暗图像 |
归一化 | 动态范围拉伸 | 简单,适合低动态范围图像 |
根据图像特性和需求选择合适方法即可。