赞
踩
图像处理是计算机视觉领域的一个重要应用,其中对比度和亮度调节是常见的基本操作。通过调节图像的对比度和亮度,可以增强图像的视觉效果,突出感兴趣的区域,并改善图像的整体质量。在本文中,我们将介绍如何利用 Qt 框架和 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;
使得代码更加简洁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。