OpenCV(图像对比度增强:线性对比度拉伸)



1. 图像对比度

图像对比度是指图像中亮部和暗部之间的差异程度。对比度越高,亮区更亮,暗区更暗;对比度低时,亮区和暗区的差异不明显,图像显得平淡。



2. 对比度调整的原理

图像对比度可以通过线性变换实现,公式如下:

\[I_{out} = \alpha \cdot I_{in} + \beta \]

  • \(I_{in}\) 是输入图像的像素值。
  • \(I_{out}\) 是输出图像的像素值。
  • \(\alpha\) 是对比度调整因子,通常大于1会增强对比度,介于0到1之间会降低对比度。
  • \(\beta\) 是亮度调整因子,它的作用是整体调整图像亮度。


3. 示例

对RGB图像进行对比度调整。

#include <opencv2/opencv.hpp>
#include <iostream>

void adjustContrast(const cv::Mat& inputImage, cv::Mat& outputImage, double alpha, double beta) {
    // 创建输出图像,初始化为和输入图像相同大小和类型
    outputImage = cv::Mat::zeros(inputImage.size(), inputImage.type());

    // 遍历每个像素点,应用对比度和亮度调整
    for (int y = 0; y < inputImage.rows; y++) {
        for (int x = 0; x < inputImage.cols; x++) {
            for (int c = 0; c < inputImage.channels(); c++) {
                // 应用公式 I_out = alpha * I_in + beta
                outputImage.at<cv::Vec3b>(y, x)[c] = cv::saturate_cast<uchar>(
                    alpha * inputImage.at<cv::Vec3b>(y, x)[c] + beta
                );
            }
        }
    }
}

int main() {
    // 读取图像
    cv::Mat image = cv::imread("input_image.jpg");
    if (image.empty()) {
        std::cerr << "无法读取图像!" << std::endl;
        return -1;
    }

    // 调整参数:alpha 调整对比度,beta 调整亮度
    double alpha = 1.5; // 对比度因子
    double beta = 20;   // 亮度偏移量

    cv::Mat outputImage;
    adjustContrast(image, outputImage, alpha, beta);

    // 显示原始图像和调整后的图像
    cv::imshow("Original Image", image);
    cv::imshow("Contrast Adjusted Image", outputImage);

    // 保存输出图像
    cv::imwrite("output_image.jpg", outputImage);

    // 等待用户按键
    cv::waitKey(0);

    return 0;
}

代码说明:

  1. adjustContrast函数: 该函数用于调整图像的对比度和亮度。遍历每个像素点,并对每个通道(RGB)应用公式:

    \[I_{out} = \alpha \cdot I_{in} + \beta \]

    其中,cv::saturate_cast<uchar>确保像素值在0到255之间。

  2. 参数alphabeta

    • alpha(对比度因子):大于1会增强对比度,0到1之间会降低对比度。
    • beta(亮度偏移量):正值增加整体亮度,负值降低整体亮度。
  3. cv::Mat::zeros(): 用于创建与输入图像相同尺寸和类型的空白图像。



4. 调整对比度的效果

  • 如果你设置 alpha = 1.5,图像对比度会变得更高,亮的部分变得更亮,暗的部分变得更暗。
  • 如果你设置 alpha = 0.5,图像的对比度会降低,亮暗之间的差异会减少。
  • beta 的调整则控制整体亮度的升高或降低。


posted @ 2024-09-22 22:15  做梦当财神  阅读(198)  评论(0编辑  收藏  举报