Qt 影像處理之 灰階變換,qt灰階

來源:互聯網
上載者:User

Qt 影像處理之 灰階變換,qt灰階

對映像的亮度、對比進行變換是很常用的一種影像處理操作,但是Qt 本身卻沒有提供相應的功能代碼。因此我寫了個簡單的類來實現這些操作。我把這個類稱為 BrightnessMapper。

 

代碼如下:

#ifndef BRIGHTNESSMAPPER_H#define BRIGHTNESSMAPPER_H#include <QImage>class BrightnessMapper{public:    BrightnessMapper();    ~BrightnessMapper();    void setRedMap(unsigned char red[]);    void setGreenMap(unsigned char green[]);    void setBlueMap(unsigned char blue[]);    void setMap(unsigned char map[]);    void updateBCG(double brightness, double contrast, double gamma);    void setColorMap(unsigned char red[], unsigned char green[], unsigned char blue[]);    void apply(const QImage &from, QImage &to);    QImage apply(const QImage &from);    unsigned char *redMap(){ return m_red;}    unsigned char *blueMap(){return m_blue;}    unsigned char *greenMap(){return m_green;}    void redMap(double red[256]);    void greenMap(double green[256]);    void blueMap(double blue[256]);private:    unsigned char m_red[256];    unsigned char m_green[256];    unsigned char m_blue[256];};#endif // BRIGHTNESSMAPPER_H

#include "brightnessmapper.h"#include <math.h>#include <QDebug>BrightnessMapper::BrightnessMapper(){    for(int i = 0; i < 256; i++)    {        m_red[i] = i;        m_green[i] = i;        m_blue[i] = i;    }}BrightnessMapper::~BrightnessMapper(){}void BrightnessMapper::updateBCG(double brightness, double contrast, double gamma){    double x, y;    for(int i = 0; i < 256; i ++)    {        x = i / 255.0;        y = exp(log(x) * gamma);        y = (y - 0.5) * brightness + 0.5 + contrast / 255;        y = y * 255.0;        m_red[i] = qBound(0.0, y, 255.0);        m_green[i] = m_red[i];        m_blue[i] = m_red[i];    }}QImage BrightnessMapper::apply(const QImage &from){    QImage to = from;    apply(from, to);    return to;}void BrightnessMapper::apply(const QImage &from, QImage &to){    if(to.size() != from.size() || to.format()!= from.format())    {        to = from.copy();    }    int height = from.height();    int width = from.width();    switch(from.format())    {    case QImage::Format_Indexed8:        for(int i = 0; i < height; i++)        {            const uchar *pFrom = (const uchar *)from.constScanLine(i);            uchar *pTo = (uchar *)to.scanLine(i);            for(int j = 0; j < width; j++)            {                pTo[j] = m_red[pFrom[i]];            }        }        break;    case QImage::Format_RGB32:    case QImage::Format_ARGB32:    case QImage::Format_ARGB32_Premultiplied:        for(int i = 0; i < height; i++)        {            const QRgb *pFrom = (const QRgb *)from.constScanLine(i);            QRgb *pTo = (QRgb *)to.scanLine(i);            for(int j = 0; j < width; j++)            {                int r, g, b;                r = qRed(pFrom[j]);                g = qGreen(pFrom[j]);                b = qBlue(pFrom[j]);                r = m_red[r];                g = m_green[g];                b = m_blue[b];                pTo[j] = qRgb(r, g, b);            }        }        break;    }}void BrightnessMapper::setRedMap(unsigned char red[]){    for(int i = 0; i < 256; i++)    {        m_red[i] = red[i];    }}void BrightnessMapper::setGreenMap(unsigned char green[]){    for(int i = 0; i < 256; i++)    {        m_green[i] = green[i];    }}void BrightnessMapper::setBlueMap(unsigned char blue[]){    for(int i = 0; i < 256; i++)    {        m_blue[i] = blue[i];    }}void BrightnessMapper::setMap(unsigned char map[]){    for(int i = 0; i < 256; i++)    {        m_red[i] = map[i];        m_green[i] = map[i];        m_blue[i] = map[i];    }}void BrightnessMapper::setColorMap(unsigned char red[], unsigned char green[], unsigned char blue[]){    for(int i = 0; i < 256; i++)    {        m_red[i] = red[i];        m_green[i] = green[i];        m_blue[i] = blue[i];    }}void BrightnessMapper::redMap(double red[256]){    for(int i = 0; i < 256; i++)    {        red[i] = m_red[i];    }}void BrightnessMapper::greenMap(double green[256]){    for(int i = 0; i < 256; i++)    {        green[i] = m_green[i];    }}void BrightnessMapper::blueMap(double blue[256]){    for(int i = 0; i < 256; i++)    {        blue[i] = m_blue[i];    }}

這個類的用法很簡單。可以用下面幾個函數來設定灰階變換關係。

 

void setRedMap(unsigned char red[]);

void setGreenMap(unsigned char green[]);

void setBlueMap(unsigned char blue[]);

void setMap(unsigned char map[]);

void setColorMap(unsigned char red[], unsigned char green[], unsigned char blue[]);

 

也可以用下面這個函數通過設定亮度、對比、gamma 值來確定變換關係。

void updateBCG(double brightness, double contrast, double gamma);

 

變換關係確定後可以利用下面兩個函數之一來對映像進行變換處理。

void apply(const QImage &from, QImage &to);

QImage apply(const QImage &from);

 

還有幾個輔助函數可以用來讀取變換關係表。

unsigned char *redMap(){ return m_red;}

unsigned char *blueMap(){return m_blue;}

unsigned char *greenMap(){return m_green;}

void redMap(double red[256]);

void greenMap(double green[256]);

void blueMap(double blue[256]);

 

因為代碼很簡答,就不多介紹了。希望對大家有用。

 


著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.