opencv图像处理功能——对比度亮度调节

图像处理是计算机视觉领域的一个重要应用,其中对比度和亮度调节是常见的基本操作。通过调节图像的对比度和亮度,可以增强图像的视觉效果,突出感兴趣的区域,并改善图像的整体质量。在本文中,我们将介绍如何利用 Qt 框架和 OpenCV 库,开发一个简单易用的图像处理应用,实现对比度和亮度的调节。

opencv对比度亮度调节

下面是使用 OpenCV 的滑动条来分别调节图像的亮度和对比度的代码

#include <opencv2/opencv.hpp>

cv::Mat image; 
cv::Mat contrastAdjustedImage, brightnessAdjustedImage;

int contrastValue = 100; 
int brightnessValue = 0; 

void contrastCallback(int, void*) {
    double alpha = static_cast<double>(contrastValue) / 100.0; // 计算对比度调节因子
    contrastAdjustedImage = cv::Mat::zeros(image.size(), image.type());
    image.convertTo(contrastAdjustedImage, -1, alpha, 0);
    cv::imshow("Contrast Adjusted Image", contrastAdjustedImage);
}

void brightnessCallback(int, void*) {
    brightnessAdjustedImage = cv::Mat::zeros(image.size(), image.type());
    image.convertTo(brightnessAdjustedImage, -1, 1.0, static_cast<double>(brightnessValue));
    cv::imshow("Brightness Adjusted Image", brightnessAdjustedImage);
}

int main() {
    image = cv::imread("image.jpg");

    cv::namedWindow("Contrast Adjusted Image");
    cv::createTrackbar("Contrast", "Contrast Adjusted Image", &contrastValue, 200, contrastCallback);
    contrastCallback(contrastValue, nullptr);

    cv::namedWindow("Brightness Adjusted Image");
    cv::createTrackbar("Brightness", "Brightness Adjusted Image", &brightnessValue, 100, brightnessCallback);
    brightnessCallback(brightnessValue, nullptr);

    // 等待用户操作
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

下面是对每一行代码的详细解释:

cv::Mat image; // 原始图像
cv::Mat contrastAdjustedImage, brightnessAdjustedImage;

int contrastValue = 100; // 对比度初始值
int brightnessValue = 0; // 亮度初始值

cv::Mat image; : 声明一个 `cv::Mat` 类型的变量 `image`,用于存储原始图像。

cv::Mat contrastAdjustedImage, brightnessAdjustedImage;: 声明两个 `cv::Mat` 类型的变量,分别用于存储调节对比度和亮度后的图像。

int contrastValue = 100; : 定义一个整型变量 `contrastValue`,用于存储对比度调节的初始值。

int brightnessValue = 0; // 亮度初始值: 定义一个整型变量 `brightnessValue`,用于存储亮度调节的初始值。

对比度调节

void contrastCallback(int, void*) {
    double alpha = static_cast<double>(contrastValue) / 100.0; // 计算对比度调节因子
    contrastAdjustedImage = cv::Mat::zeros(image.size(), image.type());
    image.convertTo(contrastAdjustedImage, -1, alpha, 0);
    cv::imshow("Contrast Adjusted Image", contrastAdjustedImage);
}

void contrastCallback(int, void*): 定义一个回调函数 `contrastCallback`,用于处理对比度调节滑动条的变化。

double alpha = static_cast<double>(contrastValue) / 100.0;: 根据滑动条的值计算出对比度调节因子 `alpha`。

contrastAdjustedImage = cv::Mat::zeros(image.size(), image.type());: 创建一个与原始图像大小和类型相同的空白 `cv::Mat` 对象 `contrastAdjustedImage`。这里的image.size(), image.type()就是我们先前定义的原始图像image的大小和类型。

image.convertTo(contrastAdjustedImage, -1, alpha, 0);: 使用 `image.convertTo()` 函数将原始图像转换到 `contrastAdjustedImage`,并应用对比度调节。其中第一个参数就是输出图像,-1: 这是输出图像的数据类型。这里设置为 -1,表示与输入图像 image 的数据类型相同。alpha: 这是对比度调节因子。它是一个双精度浮点数,表示图像像素值的缩放比例。上面有计算这个参数的公式,alpha 的值是根据滑动条的值计算得出的,用于调节图像的对比度。0: 这是亮度调节因子。它是一个双精度浮点数,表示图像像素值的偏移量。在这里设置为 0,表示不对图像的亮度进行调节。

cv::imshow("Contrast Adjusted Image", contrastAdjustedImage);: 在名为 "Contrast Adjusted Image" 的窗口中显示调节后的图像。

亮度调节

void brightnessCallback(int, void*) {
    brightnessAdjustedImage = cv::Mat::zeros(image.size(), image.type());
    image.convertTo(brightnessAdjustedImage, -1, 1.0, static_cast<double>(brightnessValue));
    cv::imshow("Brightness Adjusted Image", brightnessAdjustedImage);
}

void brightnessCallback(int, void*)`: 定义一个回调函数 `brightnessCallback`,用于处理亮度调节滑动条的变化。

brightnessAdjustedImage = cv::Mat::zeros(image.size(), image.type());: 与上面相同创建的是亮度调整图像`cv::Mat` 对象 `brightnessAdjustedImage`。

image.convertTo(brightnessAdjustedImage, -1, 1.0, static_cast<double>(brightnessValue));`: 使用 `image.convertTo()` 函数将原始图像转换到 `brightnessAdjustedImage`,并应用亮度调节。

cv::imshow("Brightness Adjusted Image", brightnessAdjustedImage);`: 在名为 "Brightness Adjusted Image" 的窗口中显示调节后的图像。

函数的调用及滑动条的添加

int main() {
    // 读取图像
    image = cv::imread("image.jpg");

    // 创建窗口并添加滑动条
    cv::namedWindow("Contrast Adjusted Image");
    cv::createTrackbar("Contrast", "Contrast Adjusted Image", &contrastValue, 200, contrastCallback);
    contrastCallback(contrastValue, nullptr);

    cv::namedWindow("Brightness Adjusted Image");
    cv::createTrackbar("Brightness", "Brightness Adjusted Image", &brightnessValue, 100, brightnessCallback);
    brightnessCallback(brightnessValue, nullptr);

    // 等待用户操作
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

image = cv::imread("image.jpg");: 读取名为 "image.jpg" 的图像文件,并将其存储在 `image` 变量中。

cv::namedWindow("Contrast Adjusted Image");`: 创建一个名为 "Contrast Adjusted Image" 的窗口。

cv::createTrackbar("Contrast", "Contrast Adjusted Image", &contrastValue, 200, contrastCallback);: 在 "Contrast Adjusted Image" 窗口中创建一个名为 "Contrast" 的滑动条,将其与 `contrastValue` 变量和 `contrastCallback` 函数关联。

contrastCallback(contrastValue, nullptr);: 调用 `contrastCallback` 函数,初始化对比度调节后的图像显示。

cv::namedWindow("Brightness Adjusted Image");: 创建一个名为 "Brightness Adjusted Image" 的窗口。

cv::createTrackbar("Brightness", "Brightness Adjusted Image", &brightnessValue, 100, brightnessCallback);: 在 "Brightness Adjusted Image" 窗口中创建一个名为 "Brightness" 的滑动条,将其与 `brightnessValue` 变量和 `brightnessCallback` 函数关联。

brightnessCallback(brightnessValue, nullptr);: 调用 `brightnessCallback` 函数,初始化亮度调节后的图像显示。

cv::waitKey(0);: 等待用户按下任意键。

cv::destroyAllWindows();: 关闭所有打开的窗口。

return 0;: 程序正常退出。

总的来说,这个代码实现了使用滑动条分别调节图像的对比度和亮度,并实时显示调节后的结果。这种方式可以让用户更直观地感受到调节效果,并找到最合适的参数设置。

注意上述都需要添加cv的命名控件

添加

using namespace cv;

使得代码更加简洁。

  • 23
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值