对图像的亮度、对照度进行变换是非经常常使用的一种图像处理操作,可是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];
}
}

这个类的使用方法非常easy。

能够用以下几个函数来设置灰度变换关系。

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]);

由于代码非常简答,就不多介绍了。

希望对大家实用。

Qt 图像处理之 灰度变换的更多相关文章

  1. qt之图像处理

    毕业2年了,一直使用的qt做桌面程序,很少接触图像算法类的东西,最近由于项目的原因,不得不了解下图像处理,不过也是一些简单的图像处理,仅此作为记录,并希望能帮助初学qt图像处理的朋友. 首先我推荐一篇 ...

  2. qt播放器

    播放器 http://blog.csdn.net/foruok/article/details/39005703 图片 http://blog.csdn.net/liyinhuicc/article/ ...

  3. 数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波

    0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> ...

  4. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

  5. (7拾遗)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  6. (6综合实验)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  7. (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  8. (2环境架设)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

  9. (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练

    从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...

随机推荐

  1. Android源代码分支、版本号、支持设备列表

    Build Branch Version Supported devicesOPD3.170816.023 android-8.0.0_r34 Oreo Pixel 2 XL, Pixel 2OPD1 ...

  2. maven 打包jar && lib

    一.springboot 打包成jar 1.pom.xml <build> <!-- jar的名称--> <finalName>shiro</finalNam ...

  3. 以shareExtension为例学习iOS扩展开发

    整体介绍 phone Extension 用法基础详解 share Extension 用法基础详解 demo链接   密码: i72z

  4. CSS 弹性盒

    图片新窗口打开浏览

  5. Win8.1应用开发之适配器模式(C#实现)

    实际上适配器模式是用于解耦.设想一下我们的程序模块A在与模块B打交道时,需要在许多地方多次使用B中某个类的方法,而负责开发B的程序猿Tom还未完全实现该类,会随时更改该类中的方法,那么当Tom在修改时 ...

  6. FAQ: SBS 2011. The Windows SBS Manager service terminated unexpectedly

    Symptoms The Windows SBS Manager service is stopped with EventID 7034 every half an hour on SBS 2011 ...

  7. 用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题

    当用ajax异步时,返回JsonResult格式的时候,发现当字段是dateTime类型时,返回的json格式既然是“/Date(1435542121135)/” 这样子的,当然这不是我们想要的格式. ...

  8. linux下的头文件和库文件搜索路径 (转)

     GCC 找头文件有三种策略: 1. 会在默认情况下指定到 /usr/include 文件夹 ( 更深层次的是一个相对路径, GCC 可执行程序的路径是 /usr/bin ,那么它在实际工作时指定头文 ...

  9. CorelDRAW X6、X7&2018,500现金返利等你拿!

    购物狂欢节要来了,你准备好了么? 不知何时起,四根神棍的日子却成了大家拼爹.拼钱包.拼手速.拼网速.拼钱包...各种火拼日子 你是从哪年关注并重视双11的,记得小编我第一次邂逅双11真的只是凑凑热闹 ...

  10. hust 1570 Lazy. Lazy. Laaaaaaaaaaaazy!

    链接 1570 - Lazy. Lazy. Laaaaaaaaaaaazy! 题意 给出三种按键,caplock,shift,nomal(像正常键盘操作一样) ,输入三串字符串,s1,s2,txt, ...