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];
}
}
这个类的使用方法非常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 图像处理之 灰度变换的更多相关文章
- qt之图像处理
毕业2年了,一直使用的qt做桌面程序,很少接触图像算法类的东西,最近由于项目的原因,不得不了解下图像处理,不过也是一些简单的图像处理,仅此作为记录,并希望能帮助初学qt图像处理的朋友. 首先我推荐一篇 ...
- qt播放器
播放器 http://blog.csdn.net/foruok/article/details/39005703 图片 http://blog.csdn.net/liyinhuicc/article/ ...
- 数字图像处理(MATLAB版)学习笔记(2)——第2章 灰度变换与空间滤波
0.小叙闲言 1.本章整体结构 2.书中例子 例2.1 主要是使用函数imadjust,来熟悉一下灰度处理,体验一把 >> imread('myimage.jpg'); >> ...
- windows平台下基于QT和OpenCV搭建图像处理平台
在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...
- (7拾遗)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- (6综合实验)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- (2环境架设)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
随机推荐
- ABP框架应用汇总
相信很多人可能听过或没听过ABP这个框架,在我接触此框架时也是在现在所在的公司开始接触的,我们用此开源框架作为我们项目的架构,我们正好做的是Saas云服务多租户管理系统开发,并且经过了一年多高 ...
- .NET WebForm 简介(9.19)
WebForm是微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率. WinForm是C/S(客户端) 主要是本机执行 WebF ...
- lua迭代
迭代 function enum(array) local index = 1 return function() --返回迭代函数 local ret = array[index] index = ...
- Android + Eclipse + NDK + cygwin配制
以前做NDK开发时留下来的笔记,希望对后继开发人员有所帮助,在开放给大家使用,有不对的地方请留,扔砖头都可以的. 为了方便在Win32下开发android C++ 程序,我们作了如下配制:1.Andr ...
- Java基础8一面向对象
一.JavaBean标准的定义规范 1.类中所有的属性必须是私有的,也就是说属性必须用private修饰. 2.提供一个公共无参数的构造方法. 3.为所有私有的属性提供公共的set和get方法. se ...
- 移动web开发常见的问题
1.屏幕旋转的事件和样式 事件 window.orientation,取值:正负90表示横屏模式.0和180表现为竖屏模式: window.onorientationchange = function ...
- Android Studio复制项目 两个App之间不覆盖安装操作步骤
步骤一:修改包名 第五步注意:不能以数字等作为包名的开头. 步骤二:修改清单文件里面的包名 第八步注意:如果报红,从新引入新的包名下的Mainactivity类. 步骤三:修改Gradle Scrip ...
- mysql 主从错误情况与原因
mysql 主从错误情况1,master 上删除一条记录是从库报错 找不到该记录引起原因:master出现宕机或者从库已经删除.解决方案:stop slave;set global sql_slave ...
- 生成式模型:LDA
原文链接:http://blog.sina.com.cn/s/blog_5033f3b40101flbj.html 文章图文并茂,我就不转载了!!! LSI-Laten ...
- VGG 19
关于VGG19的一些参考资料 http://www.cnblogs.com/vipyoumay/archive/2017/11/23/7884472.html https://cloud.tencen ...