c++对大图像调整对比度和亮度,要求对比度调整系数在0~100,亮度参数在-50~50之间
时间: 2024-10-12 21:17:37 浏览: 16
在C++中调整大图像的对比度和亮度,我们可以结合上面提到的方法,并添加亮度调整的部分。以下是具体步骤:
1. **引入库和头文件**:
首先确保已经包含了OpenCV库。
```cpp
#include <opencv2/opencv.hpp>
```
2. **读取和分割大图像**:
读取图像,然后将其分成小块以便于处理。
```cpp
cv::Mat img = cv::imread("large_image.jpg", cv::IMREAD_COLOR); // 读取彩色图像
cv::Mat brightAdj(img.size(), img.type()); // 创建一个新的调整后图像
// 分块大小和步长
int blockSize = 8;
int stepSize = blockSize - 1;
```
3. **调整每个块的对比度和亮度**:
定义一个辅助函数,接受块、对比度系数和亮度值作为参数。
```cpp
void adjustBlock(cv::Mat& block, float contrast, int brightness) {
double alpha = 1.0 + contrast / 100.0;
double beta = brightness / 100.0;
if (alpha > 0) {
cv::Mat grayBlock;
cv::cvtColor(block, grayBlock, cv::COLOR_BGR2GRAY);
cv::Mat adjBlock;
cv::addWeighted(grayBlock, alpha, grayBlock, 1 - alpha, beta, adjBlock);
// 将调整后的灰度块转换回BGR色彩空间
cv::cvtColor(adjBlock, block, cv::COLOR_GRAY2BGR);
} else {
block.setTo(cv::Scalar(0, 0, 0)); // 如果对比度过低,设为黑
}
}
// 循环处理所有块
for (int y = 0; y < img.rows; y += blockSize) {
for (int x = 0; x < img.cols; x += blockSize) {
cv::Rect block(x, y, blockSize, blockSize);
adjustBlock(brightAdj(block), contrastLevel, brightnessLevel);
}
}
```
4. **合并调整后的图像**:
将调整后的块复制回原图像矩阵。
```cpp
img.copyTo(brightAdj);
```
5. **保存结果**:
最后保存处理后的图像。
```cpp
cv::imwrite("output_image.jpg", brightAdj);
```
阅读全文