zoukankan      html  css  js  c++  java
  • 基础学习笔记之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,欢迎交流!)
  • 相关阅读:
    php设计模式-工厂模式(一)
    php Pthread 线程 互斥锁
    php Pthread 多线程 Worker
    PHP多进程实例
    C# this 关键字
    .NET FileStream文件流,StreamReader文本流,MemoryStream内存流几种流的实例
    深入理解Static关键字修饰符
    SQL Server 视图
    .NET初识委托
    RSA加密
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2606081.html
Copyright © 2011-2022 走看看