对图像的亮度、对照度进行变换是非经常常使用的一种图像处理操作,可是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. JWT和Spring Security集成

    通常情况下,把API直接暴露出去是风险很大的, 我们一般需要对API划分出一定的权限级别,然后做一个用户的鉴权,依据鉴权结果给予用户对应的API (一)JWT是什么,为什么要使用它? 互联网服务离不开 ...

  2. NOIP2012D2T1 同余方程

    [NOIP2012T4]同余方程 noip2012-tg 描述 求关于 x的同余方程 ax ≡ 1(mod b) 的最小正整数解. 输入格式 输入文件 mod.in 输入只有一行,包含两个正整数a,b ...

  3. JavaScript中的工厂方法、构造函数与class

    JavaScript中的工厂方法.构造函数与class 本文转载自:众成翻译 译者:谢于中 链接:http://www.zcfy.cc/article/1129 原文:https://medium.c ...

  4. css 画三角形

    <div class='triangle-rihgt'></div> <div class='triangle-top'></div> <div ...

  5. 了解权限控制框架shiro 之实际应用.

    Apache Shiro 1.权限控制分为 a.粗粒度 URL 级别权限控制     b.细粒度方法级别权限控制 2.使用shiro进行权限控制主要有四种主要方式 : a. 在程序中 通过 Subje ...

  6. RabbitMQ学习笔记(4)----RabbitMQ Exchange(交换机)的使用

    1. fanout模式 1.1 Publish/Subscribe(发布/订阅)结构图 上图表示一个消费者消费消息之后,不讲消息直接存储到队列,而是使用两个消费者各自声明一个队列,将各自的对应的队列与 ...

  7. 优动漫PAINT(clip studio paint)提示无法连接服务器

    很多同学在使用优动漫PAINT进行艺术创作的时候,软件会出现无法连接服务器的提示,遇到此情况如何解决呢?目前,软件在Windows系统和Mac系统上的解决方法有别,请悉知: 1.曾使用过,或正在使用F ...

  8. 克隆CentOS 6.9 配置静态IP,重启网络服务时报错

    克隆的CentOS 6.9 第一次开机时,VMware workstation会为新虚拟机自动生成新mac地址,导致虚拟机配置文件中mac地址与虚拟机新mac地址不一致. 解决方法:1. 修改网卡配置 ...

  9. Chernobyl’ Eagle on a Roof(鹰蛋坚固度)

    链接 Chernobyl’ Eagle on a Roof 题意 引用论文题意:有一堆共 M 个鹰蛋,一位教授想研究这些鹰蛋的坚硬度 E.他是通过不断从一幢 N 层的楼上向下扔鹰蛋来确定 E 的.当鹰 ...

  10. 用基于WebGL的BabylonJS来共享你的3D扫描模型

    转自:http://www.geekfan.net/6578/ 用基于WebGL的BabylonJS来共享你的3D扫描模型 杰克祥子 2014 年 2 月 26 日 0 条评论 标签:3D扫描 , B ...