一般通过工业相机拍摄的图片会存在较暗的情况,图片质量差对于显示信息以及后续的处理都有影响,比如一下图片就是工业相机在钢管厂所拍摄的

可以看到该图片质量较差,一般会给该图片增加亮度,如以下代码:

    cv::Mat image = cv::imread("C:/Users/Andy/Desktop/picture/pipes.jpg");
    if (image.empty())
    {
        std::cerr << "Error: 无法加载图像文件" << std::endl;
        return -1;
    }

    // 增加亮度90(自动处理溢出)
    cv::Mat brightenedImage;
    cv::Mat brightenedImage1;
    cv::add(image, cv::Scalar(70, 70, 70), brightenedImage);
    brightenedImage.convertTo(brightenedImage1, -1, 1.5, 1); // 调整对比度和亮度
    // 显示处理后的图像
    cv::imshow("picture", brightenedImage1);
    cv::waitKey(1); // 非阻塞调用,确保窗口正常显示

可以得到结果如下:

可以看到该图片结果依旧不是很好,显得太白了,需要提高图片的对比度。所以可以选在采用伽马校正增加图片亮度,使暗的更暗,亮的更亮,提高对比度,代码如下所示:

    cv::Mat enhancedSrc;
    // 2. 设置伽马值(大于1降低曝光,小于1增加曝光)
    double gamma = 0.49;
    // 3. 创建伽马校正查找表
    cv::Mat lookupTable(1, 256, CV_8U);
    uchar* lut = lookupTable.ptr();
    for (int i = 0; i < 256; ++i)
    {
        lut[i] = cv::saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);
    }
    // 4. 应用伽马校正
    cv::Mat adjustedImage;
    cv::LUT(image, lookupTable, adjustedImage);
    adjustedImage.convertTo(enhancedSrc, -1, 1.5, 1); // 调整对比度和亮度
    // 显示处理后的图像
    cv::imshow("picture1", enhancedSrc);
    cv::waitKey(1); // 非阻塞调用,确保窗口正常显示;

结果如下:

可以明显感觉这种处理比增加亮度得到的结果更好,更能显示图片原本的信息。两种方式对比如下所示。

#include "mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // 读取输入图像(需替换实际路径)
    cv::Mat image = cv::imread("C:/Users/Andy/Desktop/picture/pipes.jpg");
    if (image.empty())
    {
        std::cerr << "Error: 无法加载图像文件" << std::endl;
        return -1;
    }


    // 增加亮度90(自动处理溢出)
    cv::Mat brightenedImage;
    cv::Mat brightenedImage1;
    cv::add(image, cv::Scalar(70, 70, 70), brightenedImage);
    brightenedImage.convertTo(brightenedImage1, -1, 1.5, 1); // 调整对比度和亮度
    // 显示处理后的图像
    cv::imshow("picture", brightenedImage1);
    cv::waitKey(1); // 非阻塞调用,确保窗口正常显示


    cv::Mat enhancedSrc;
    // 2. 设置伽马值(大于1降低曝光,小于1增加曝光)
    double gamma = 0.49;
    // 3. 创建伽马校正查找表
    cv::Mat lookupTable(1, 256, CV_8U);
    uchar* lut = lookupTable.ptr();
    for (int i = 0; i < 256; ++i)
    {
        lut[i] = cv::saturate_cast<uchar>(pow(i / 255.0, gamma) * 255.0);
    }
    // 4. 应用伽马校正
    cv::Mat adjustedImage;
    cv::LUT(image, lookupTable, adjustedImage);
    adjustedImage.convertTo(enhancedSrc, -1, 1.5, 1); // 调整对比度和亮度
    // 显示处理后的图像
    cv::imshow("picture1", enhancedSrc);
    cv::waitKey(1); // 非阻塞调用,确保窗口正常显示;

    // MainWindow w;
    // w.show();
    return a.exec();
}

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐