• 基础学习笔记之opencv(12):改变图像对比度和亮度


      本文主要讲讲怎样改变图片的对比度和亮度,其实就是图片像素值线性变化了而已,对比度对应线性变化的系数,亮度对应其常量。参考资料为opencv自带tutiol及其code.

      开发环境:ubuntu12.04+opencv2.4.2+Qt4.8.2+QtCreator2.5.


      实验功能:

      单击Open image按钮,在电脑中打开一张图片并显示出来。

      拖动Contrast滑动条,改变对比度的值,可以看到对比度值的改变过程在滑动条下方显示,左边图片对应为其对比度改变后的效果。

      拖动Brightness滑动条,改变亮度值,以看到亮度值的改变过程在滑动条下方显示,左边图片对应为其亮度改变后的效果。

      点击Close按钮,退出程序。


      实验说明:

      本实验利用的原理是对图片中每个像素点的值进行变换,其变换公式为:

      g(i,j) = contrast*f(i,j)+brightness.

      其中g(i,j)为变换后第i行第j列像素点值,f(i,j)为变换前对应点的值。

      上面公式的实现是利用opencv自带的函数,Mat::converTo(),1个参数为输出图像;第2个参数为输出图像Mat的数据类型,包括深度和通道数等,如果和原图像相同,则设置为-1;第3个参数为对比度值;第4个参数为亮度值。

      当在TextBrowser中进行图片显示时,如果需要让显示图片的窗口自适应图片的大小,可采用QTextBrowser下的setFixedWidth()setFixedHeight()函数来设置窗口尺寸,其参数是从图片中获取。当然这个设置的窗口长和宽已经包括了右边和下边的滚动条,所以给参数的时候需要把这2者考虑进去。 

      要对整个窗口的背景该色,且不改变其上面控件的背景色,则这时需用QPalette类。且时需用Window作为背景色角色;如果用Base作为背景色角色的话,那么它只会改变QTextEidt类及其派生类的背景色;如果用seStyleSheet,其用background-color的话,那么它会把其上面的控件背景色全改了,且相应的子窗口的也都改了。

      在Qt中,将1个数值a转换成文本,可采用,tr(“%1”).arg(a).

      实验结果:

      原图:

      

      只改变对比度,值为3.1效果图:

      

      只改变亮度,值为80效果图:

      

      同时改变,对比度值为3.1,亮度值为80效果图:

      


    实验主要部分代码及注释(附录有工程code下载链接):

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QFileDialog>
    #include <iostream>
    
    using namespace std;
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        contrast = 1.0;
        brightness = 1.0;
    
        ui->textBrowser->verticalScrollBar()->setFixedHeight( 25 );
        ui->textBrowser->horizontalScrollBar()->setFixedWidth( 25 );
     //   ui->textBrowser->verticalScrollBar()->hide();
     //   ui->textBrowser->horizontalScrollBar()->hide();
    
        //改变整个窗体的颜色
        QPalette pal_win;
     //   pal_win.setColor( QPalette::Base, Qt::black );//这句改变的只是TextBrowser的背景
        pal_win.setColor( QPalette::Window, Qt::black );//这句改变的是除掉TextBrowser和Button等各种后的背景
        MainWindow::setPalette( pal_win );
    //    MainWindow::setStyleSheet( "background-color:black" );//这样整个窗口都变黑了,且其子窗口背景也是黑的
    
        //改变button的颜色
        QPalette pal_btn;
        pal_btn.setColor( QPalette::ButtonText, Qt::green );
        pal_btn.setColor( QPalette::Button, Qt::black );
        ui->closeButton->setPalette( pal_btn );
        ui->openButton->setPalette( pal_btn );
    
        //改变label的颜色
        QPalette pal_label;
        pal_label.setColor( QPalette::WindowText, Qt::green );
        pal_label.setColor( QPalette::Base, Qt::black );
        ui->contrastLabel->setPalette( pal_label );
        ui->brightnessLabel->setPalette( pal_label );
        ui->label1->setPalette( pal_label );
        ui->label2->setPalette( pal_label );
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_openButton_clicked()
    {
        QString img_name = QFileDialog::getOpenFileName( this, "Open image", "../change_value", tr("Image Files(*.png *bmp *jpg *jpeg)") );
        img = imread( img_name.toAscii().data() );
        if( !img.empty() )
        {
            ui->textBrowser->clear();
            ui->textBrowser->append( tr("<img src=%1>").arg(img_name) );
         //   ui->textBrowser->setFixedWidth( img.cols );
         //   ui->textBrowser->setFixedHeight( img.rows );
            ui->textBrowser->setFixedWidth( img.cols+ui->textBrowser->verticalScrollBar()->width() );//其实这里面的计算也不是特别准
            ui->textBrowser->setFixedHeight( img.rows+ui->textBrowser->horizontalScrollBar()->height() );
        }
    
        //
    }
    
    void MainWindow::on_closeButton_clicked()
    {
        close();
    }
    
    void MainWindow::on_contrastScrollBar_valueChanged(int value)
    {
        contrast = (double)value/10;//将其转换成0~10之间的小数,间隔为0.1
        img.convertTo( img_change, -1, contrast, brightness );
        imwrite( "../change_value/change_img.jpg", img_change );
        ui->textBrowser->clear();
        ui->textBrowser->append( "<img src=../change_value/change_img.jpg>" );
        ui->label1->clear();
        ui->label1->setText( tr("%1").arg(contrast) );
    }
    
    void MainWindow::on_brightScrollBar_valueChanged(int value)
    {
        brightness = (double)value;
        img.convertTo( img_change, -1, contrast, brightness );
        imwrite( "../change_value/change_img.jpg", img_change );
        ui->textBrowser->clear();
        ui->textBrowser->append( "<img src=../change_value/change_img.jpg>" );
        ui->label2->clear();
        ui->label2->setText( tr("%1").arg(brightness) );
    }

      实验总结:

      这次图片显示窗口可以自适应图片大小了,但是第一次打开图片时,偶尔叶会出现不能自适应的问题,目前还没找到原因。


      附:工程code下载.


    作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:tornadomeet,欢迎交流!)
  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2606081.html
Copyright © 2020-2023  润新知