基礎學習筆記之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下載.


 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM