用qt和opencv实现对一张图片的亮度对比度和伽马值修改,并用滑动进度条修改
时间: 2023-08-31 20:20:21 浏览: 456
### 回答1:
好的,具体实现步骤如下:
1. 使用Qt的GUI界面,添加三个滑动进度条控件,分别用于调整亮度、对比度和伽马值。
2. 使用OpenCV的cv::Mat类读取图片数据,并将其显示在GUI界面上。
3. 实现亮度调整功能:将原始图像的每个像素值加上一个亮度值,可使用cv::add()函数实现。
4. 实现对比度调整功能:将原始图像的每个像素值乘上一个对比度值,可使用cv::multiply()函数实现。
5. 实现伽马值调整功能:将原始图像的每个像素值按照公式进行伽马变换,可使用cv::pow()函数实现。
6. 将修改后的图像数据重新显示在GUI界面上。
下面是代码示例:
MainWindow.h
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <opencv2/opencv.hpp>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_brightnessSlider_valueChanged(int value);
void on_contrastSlider_valueChanged(int value);
void on_gammaSlider_valueChanged(int value);
private:
Ui::MainWindow *ui;
cv::Mat m_originalImage;
cv::Mat m_modifiedImage;
double m_brightness;
double m_contrast;
double m_gamma;
void updateImage();
};
#endif // MAINWINDOW_H
```
MainWindow.cpp
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// load image
m_originalImage = cv::imread("image.jpg");
m_originalImage.convertTo(m_modifiedImage, -1, 1, 0); // make a copy
// initialize sliders
ui->brightnessSlider->setMinimum(-100);
ui->brightnessSlider->setMaximum(100);
ui->brightnessSlider->setValue(0);
ui->contrastSlider->setMinimum(-100);
ui->contrastSlider->setMaximum(100);
ui->contrastSlider->setValue(0);
ui->gammaSlider->setMinimum(1);
ui->gammaSlider->setMaximum(100);
ui->gammaSlider->setValue(50);
// initialize variables
m_brightness = 0.0;
m_contrast = 1.0;
m_gamma = 1.0;
// display image
updateImage();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_brightnessSlider_valueChanged(int value)
{
m_brightness = (double)value / 100.0;
updateImage();
}
void MainWindow::on_contrastSlider_valueChanged(int value)
{
m_contrast = (double)value / 100.0 + 1.0;
updateImage();
}
void MainWindow::on_gammaSlider_valueChanged(int value)
{
m_gamma = (double)value / 50.0;
updateImage();
}
void MainWindow::updateImage()
{
// adjust brightness and contrast
m_modifiedImage = m_originalImage * m_contrast + m_brightness * 255;
// adjust gamma
cv::Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.ptr();
for (int i = 0; i < 256; ++i)
{
p[i] = cv::saturate_cast<uchar>(pow(i / 255.0, m_gamma) * 255.0);
}
cv::LUT(m_originalImage, lookUpTable, m_modifiedImage);
// display image
cv::imshow("Image", m_modifiedImage);
cv::waitKey(10);
}
```
在这个例子中,我们使用了cv::imread()函数来读取一张图片,然后将其转换为cv::Mat类型。我们还使用了cv::convertTo()函数来创建一个副本,以便在修改图像时不影响原始图像。
我们为每个滑块控件设置了最小、最大和初始值。在滑块值发生变化时,我们更新对应的变量并调用updateImage()函数来重新生成修改后的图像。
在updateImage()函数中,我们使用了cv::multiply()和cv::add()函数来实现对比度和亮度的调整。我们还使用了cv::LUT()函数来实现伽马值调整。最后,我们使用cv::imshow()函数将修改后的图像显示在窗口中。
注意:在Qt中,我们需要使用cv::waitKey()函数来让OpenCV窗口保持活动状态,否则窗口会立即关闭。
### 回答2:
使用QT和OpenCV可以实现对一张图片的亮度、对比度和伽马值进行修改,并可以利用滑动进度条来调整参数。
首先,我们需要加载并显示原始图片。可以使用QT的图像控件(QLabel或QGraphicsView)来显示图片。
接下来,我们可以利用OpenCV对原始图片进行处理。通过调整亮度和对比度参数,可以使用下面的公式实现:
新像素 = 旧像素 * 对比度 + 亮度
其中,亮度的范围为[-255, 255],对比度的范围为[-100, 100]。为了确保结果在0-255的合理范围内,可以采用以下方式进行裁剪:
新像素 = min(max(新像素, 0), 255)
另外,伽马值的调整可以通过以下公式实现:
新像素 = 255 * pow(旧像素 / 255, 1 / 伽马值)
在QT中,我们可以使用滑动进度条(QSlider)来调整这些参数。首先,我们需要创建滑动进度条并设定其范围。然后,当滑动条的值发生变化时,我们可以通过获取滑动条的当前值并将其转换为亮度、对比度或伽马值参数的百分比来更新处理后的图像。
最后,我们还需要将处理后的图像显示在QT的图像控件中。
通过这种方式,我们就能够使用QT和OpenCV实现对一张图片的亮度、对比度和伽马值的修改,并利用滑动进度条来进行动态调整。
### 回答3:
使用Qt和OpenCV实现对一张图片的亮度、对比度和伽马值修改,并用滑动进度条来实现如下:
1. 首先,我们需要在Qt中创建一个窗口界面,并添加一个滑动进度条,用于控制亮度、对比度和伽马值的修改。可以使用Qt Designer工具来创建界面。
2. 在Qt中,将滑动进度条与相关的控件连接起来,以便在滑动进度条发生变化时能够触发相应的操作。
3. 使用OpenCV加载并显示待修改的图片。可以使用`cv::imread()`函数来加载图片,并将其显示在Qt界面上的图片控件中。
4. 当滑动进度条发生变化时,通过信号和槽机制,处理亮度、对比度和伽马值的修改。根据滑动进度条的值,计算相应的系数来修改图像的亮度、对比度和伽马值。
5. 在处理过程中,使用OpenCV的函数来实现图像的亮度、对比度和伽马值的修改。可以使用`cv::convertTo()`函数来调整图像的亮度和对比度,使用`cv::pow()`函数来调整图像的伽马值。
6. 将修改后的图像显示在Qt界面上的图片控件中,以实时显示修改操作的效果。
总结:通过使用Qt和OpenCV,我们可以实现通过滑动进度条来修改一张图片的亮度、对比度和伽马值。这种方法简单易用,可以直观地观察到图像的修改效果。
阅读全文