问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

OpenCV教你玩转图像亮度与对比度

创作时间:
作者:
@小白创作中心

OpenCV教你玩转图像亮度与对比度

引用
CSDN
12
来源
1.
https://blog.csdn.net/m0_56741902/article/details/135921841
2.
https://m.blog.csdn.net/donghaodonghaodo/article/details/136186456
3.
https://cloud.baidu.com/article/3355546
4.
https://m.blog.csdn.net/HanWenKing/article/details/141172351
5.
https://m.blog.csdn.net/m0_46704925/article/details/139046246?spm=1001.2014.3001.5501
6.
https://cloud.baidu.com/article/2917585
7.
https://xueshu.baidu.com/usercenter/data/paperhelp?cmd=paper_forward&longsign=304d026d8eefcaee239bf06c4d06d10b&title=Photoshop%E5%92%8COpenCV%E7%9A%84%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E6%95%99%E5%AD%A6%E5%BA%94%E7%94%A8
8.
https://jingyan.baidu.com/tag?pn=0&rn=10&tagName=%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86
9.
https://blog.csdn.net/Direct_Yang/article/details/139353467
10.
https://cloud.baidu.com/article/3345360
11.
https://m.w3cschool.cn/opencv/opencv-c6yv2cb1.html
12.
https://www.cnblogs.com/keye/p/18426015

在计算机视觉和图像处理领域,OpenCV(Open Source Computer Vision Library)是一个不可或缺的工具。自1999年Intel首次发布以来,OpenCV以其强大的功能和易用性,成为了计算机视觉领域最有力的研究工具之一。它支持多种编程语言(如C++、Python、Java等)和操作系统(如Windows、Linux、Mac OS等),并实现了图像处理和计算机视觉方面的许多通用算法。

在图像处理中,亮度和对比度的调节是最基本也是最常用的操作之一。通过调整亮度和对比度,可以显著改善图片的质量,使其更加符合需求。本文将详细介绍如何利用OpenCV来调节图像的亮度和对比度,帮助读者更好地理解和运用这一技术。

01

亮度和对比度调节原理

在数字图像处理中,亮度和对比度的调节可以通过简单的线性变换实现。假设输入图像的像素值为f(x),输出图像的像素值为g(x),则亮度和对比度的调节可以通过以下公式实现:

g(x) = α * f(x) + β

其中,α控制对比度,β控制亮度。α>1时,对比度增强;0<α<1时,对比度减弱。β>0时,亮度增加;β<0时,亮度降低。

在OpenCV中,可以通过多种方式实现亮度和对比度的调节。最直接的方法是使用cv::convertTo()函数,该函数的模板定义为:

void convertTo(OutputArray dst, int dtype, double alpha = 1, double beta = 0)

参数说明:

  • dst:表示输出图像的对象,通常是一个cv::Mat类型的变量,用于存储转换后的图像;
  • dtype:表示目标图像的数据类型,用于指定输出图像的像素类型;
  • alpha:可选参数,表示缩放因子。默认值为1,表示不进行缩放。如果指定一个非零值,会将图像的像素值乘以该因子进行缩放;
  • beta:可选参数,表示偏移量。默认值为0,表示不进行偏移。如果指定一个非零值,会将图像的像素值加上该偏移量。

下面是一个使用cv::convertTo()函数调节亮度和对比度的代码示例:

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    double alpha = 1.0; /*< Simple contrast control */
    int beta = 0;       /*< Simple brightness control */
    String imageName("../data/lena.jpg"); // by default
    if (argc > 1) {
        imageName = argv[1];
    }
    Mat image = imread(imageName);
    Mat new_image = Mat::zeros(image.size(), image.type());

    cout << " Basic Linear Transforms " << endl;
    cout << "-------------------------" << endl;
    cout << "* Enter the alpha value [1.0-3.0]: ";
    cin >> alpha;
    cout << "* Enter the beta value [0-100]: ";
    cin >> beta;

    // 使用convertTo函数调节亮度和对比度
    image.convertTo(new_image, -1, alpha, beta);

    namedWindow("Original Image", WINDOW_AUTOSIZE);
    namedWindow("New Image", WINDOW_AUTOSIZE);
    imshow("Original Image", image);
    imshow("New Image", new_image);
    waitKey();
    return 0;
}

另一种实现方式是使用cv::addWeighted()函数,该函数可以实现加权求和操作,同样可以用来调节亮度和对比度。其函数原型为:

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst)

参数说明:

  • src1:第一幅输入图像;
  • alpha:第一幅图像的权重;
  • src2:第二幅输入图像;
  • beta:第二幅图像的权重;
  • gamma:加到结果上的标量;
  • dst:输出图像。

使用cv::addWeighted()函数调节亮度和对比度的代码示例如下:

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    double alpha = 1.0; /*< Simple contrast control */
    int beta = 0;       /*< Simple brightness control */
    String imageName("../data/lena.jpg"); // by default
    if (argc > 1) {
        imageName = argv[1];
    }
    Mat image = imread(imageName);
    Mat new_image = Mat::zeros(image.size(), image.type());

    cout << " Basic Linear Transforms " << endl;
    cout << "-------------------------" << endl;
    cout << "* Enter the alpha value [1.0-3.0]: ";
    cin >> alpha;
    cout << "* Enter the beta value [0-100]: ";
    cin >> beta;

    // 使用addWeighted函数调节亮度和对比度
    addWeighted(image, alpha, Mat(), 0, beta, new_image);

    namedWindow("Original Image", WINDOW_AUTOSIZE);
    namedWindow("New Image", WINDOW_AUTOSIZE);
    imshow("Original Image", image);
    imshow("New Image", new_image);
    waitKey();
    return 0;
}
02

OpenCV与其他图像处理工具的比较

与Photoshop等专业图像处理软件相比,OpenCV具有以下特点:

  1. 专业领域不同:OpenCV更侧重于计算机视觉和图像处理的基础算法,而Photoshop则专注于图像编辑和创意设计。

  2. 使用场景不同:OpenCV可以集成到更大的应用程序中,适合开发实时的计算机视觉系统;而Photoshop主要用于独立的图像编辑任务。

  3. 性能差异:OpenCV的处理速度通常更快,适合处理大量图像数据;而Photoshop在处理复杂图像编辑任务时可能更直观易用。

  4. 灵活性:OpenCV支持多种编程语言和操作系统,具有更高的灵活性;而Photoshop则是一个独立的软件应用。

在实际项目中,选择使用OpenCV还是其他工具,需要根据具体需求和场景来决定。如果需要开发实时的计算机视觉系统,OpenCV无疑是更好的选择;如果只是进行简单的图像编辑任务,使用Photoshop等工具可能更为便捷。

03

实际应用案例

OpenCV在实际项目中的应用场景非常广泛,包括但不限于:

  1. 智能监控:通过人脸识别、行为分析等技术,提高监控系统的智能化水平。

  2. 自动驾驶:利用图像处理和机器学习算法,实现车辆的自主导航和避障。

  3. 医学图像处理:用于病灶检测、图像分割等,辅助医生进行诊断和治疗。

  4. 工业检测:通过图像分析,实现产品质量的自动化检测。

  5. 农业图像分析:用于作物生长监测、病虫害识别等。

  6. 机器人技术:为机器人提供视觉感知能力,实现自主导航和交互。

在实际开发中,使用OpenCV可能会遇到以下问题:

  1. 性能优化:在处理大量图像数据时,需要对算法进行优化以提高处理速度。

  2. 跨平台兼容性:虽然OpenCV支持多种操作系统,但在不同平台上可能会遇到一些兼容性问题。

  3. 算法选择:面对复杂的图像处理任务时,选择合适的算法是一个挑战。

  4. 开发效率:与专业图像处理软件相比,使用OpenCV进行开发可能需要更多的编程知识和时间。

04

总结

OpenCV作为计算机视觉领域的强大工具,其在亮度和对比度调节方面的功能只是冰山一角。通过掌握这些基础技术,开发者可以更好地应对各种图像处理任务。OpenCV不仅提供了丰富的图像处理函数,还支持多种编程语言和操作系统,使其成为开发实时计算机视觉系统的理想选择。对于希望深入学习计算机视觉技术的读者来说,OpenCV无疑是一个值得深入研究的工具。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号