图像编辑之对比度调整(亮度对比度的算法公式)
来源:互联网 发布:淘宝二手自行车怎么样 编辑:程序博客网 时间:2024/05/16 07:53
转自:http://blog.csdn.net/pizi0475/article/details/6740428
继续图片编辑系列的文章,这次讲讲对图片对比度的调整方法。开篇先闲话一番,讲讲一些相关的东西。先是TinyImage的进度,因为某次莫名其妙用另外一个文件把一个很重要的头文件给覆盖了,导致出来一堆编译错误,改了大半个小时,于是为了保险起见赶紧整了个SVN。其次是本来这个周想写写色彩平衡的东西—-上星期主要在研究GIMP中关于色彩平衡实现的代码,但是因为各种原因:周六一大早折腾起来买票,搞得一天都没精神,周日又要去周老师家腐败,没啥心思整理相应的东西,所以先讲讲简单的东西。
对比度,具体的概念解释可以参考Wiki或者百度百科。简单的讲对比度反应了图片上亮区域和暗区域的层次感。而反应到图像编辑上,调整对比度就是在保证平均亮度不变的情况下,扩大或缩小亮的点和暗的点的差异。既然是要保证平均亮度不变,所以对每个点的调整比例必须作用在该值和平均亮度的差值之上,这样才能够保证计算后的平均亮度不变,故有调整公式:
Out = Average + (In – Average) * ( 1 + percent)
其中In表示原始像素点亮度,Average表示整张图片的平均亮度,Out表示调整后的亮度,而percent即调整范围[-1,1]。证明这个公式的正确性相当简单:
设图上有n个像素点,各个点亮度为Ai,平均亮度为A,变化率为alpha,则有:但是实际处理中,并没有太多的必要去计算一张图的平均亮度:一来耗时间,二来在平均亮度上的精确度并不会给图像的处理带来太多的好处—-一般就假设一张图的平均亮度为128,即一半亮度,而一张正常拍照拍出来的图平均亮度应该是在[100,150]。在肉眼看来两者基本没有任何区别,而如果真实地去计算平均亮度还会带来很大的计算量。如下:
通过计算平均亮度来调整对比度
01
void
AdjustContrastUsingAverageThreshold(TiBitmapData& bitmap,
double
level)
02
{
03
04
TINYIMAGE_ASSERT_VOID(level >= -1.0 && level <= 1.0);
05
06
double
rThresholdSum = 0,gThresholdSum = 0,bThresholdSum = 0;
07
double
detal= level + 1;
08
int
width = bitmap.GetWidth();
09
int
height = bitmap.GetHeight();
10
int
stride = bitmap.GetStride();
11
int
bpp = bitmap.GetBpp();
12
u8* bmpData = bitmap.GetBmpData();
13
int
offset = stride - width * bpp;
14
long
pixels = bitmap.GetTotalPixels();
15
16
for
(
int
i = 0; i < height; i ++)
17
{
18
for
(
int
j = 0; j < width; j++)
19
{
20
rThresholdSum += bmpData[rIndex];
21
gThresholdSum += bmpData[gIndex];
22
bThresholdSum += bmpData[bIndex];
23
bmpData += bpp;
24
}
25
bmpData += offset;
26
}
27
28
int
rThreshold = (
int
)(rThresholdSum/pixels);
29
int
gThreshold = (
int
)(gThresholdSum/pixels);
30
int
bThreshold = (
int
)(bThresholdSum/pixels);
31
32
u8 r_lookup[256],g_lookup[256],b_lookup[256];
33
34
for
(
int
i = 0; i < 256; i++)
35
{
36
r_lookup[i] = (u8)CLAMP0255(rThreshold + (i - rThreshold)* detal);
37
g_lookup[i] = (u8)CLAMP0255(gThreshold + (i - gThreshold)* detal);
38
b_lookup[i] = (u8)CLAMP0255(bThreshold + (i - bThreshold)* detal);
39
}
40
41
AdjustCurve(bitmap,r_lookup,g_lookup,b_lookup);
42
}
不计算平均亮度:
01
void
AdjustContrastUsingConstThreshold(TiBitmapData& bitmap,
double
level)
02
{
03
04
TINYIMAGE_ASSERT_VOID(level >= -1.0 && level <= 1.0);
05
06
u8 lookup[256];
07
double
delta = 1 + level;
08
const
int
threshold = 0x7F;
//128 可以认为是平均亮度
09
10
for
(
int
i = 0; i < 256; i++)
11
{
12
lookup[i] = (u8)CLAMP0255(threshold + (i - threshold)* delta);
13
}
14
15
AdjustCurve(bitmap,lookup,TINYIMAGE_CHANEL_RGB);
16
}
而在调用算法的时候完全可以通过一个开关来控制到底是调用哪个—-个人推荐下一种,虽然不严格符合调整对比度的语义,但效果基本一致。在Release下下一种基本是瞬间完成,对于3K*2K的图也能保证在100ms内完成。
1
void
AdjustContrast(TiBitmapData& bitmap,
double
level)
2
{
3
#ifdef CONSTTHRESHOLD
4
AdjustContrastUsingConstThreshold(bitmap,level);
5
#else
6
AdjustContrastUsingAverageThreshold(bitmap,level);
7
#endif
8
}
一、Photoshop对比度算法。可以用下面的公式来表示:
(1)、nRGB = RGB + (RGB - Threshold) * Contrast / 255
公式中,nRGB表示图像像素新的R、G、B分量,RGB表示图像像素R、G、B分量,Threshold为给定的阀值,Contrast为处理过的对比度增量。
Photoshop对于对比度增量,是按给定值的正负分别处理的:
当增量等于-255时,是图像对比度的下端极限,此时,图像RGB各分量都等于阀值,图像呈全灰色,灰度图上只有1条线,即阀值灰度;
当增量大于-255且小于0时,直接用上面的公式计算图像像素各分量;
当增量等于 255时,是图像对比度的上端极限,实际等于设置图像阀值,图像由最多八种颜色组成,灰度图上最多8条线,即红、黄、绿、青、蓝、紫及黑与白;
当增量大于0且小于255时,则先按下面公式(2)处理增量,然后再按上面公式(1)计算对比度:
(2)、nContrast = 255 * 255 / (255 - Contrast) - 255
公式中的nContrast为处理后的对比度增量,Contrast为给定的对比度增量。
二、图像亮度调整。本文采用的是最常用的非线性亮度调整(Phoposhop CS3以下版本也是这种亮度调整方式,CS3及以上版本也保留了该亮度调整方式的选项),本文亮度调整采用MMX,对亮度增量分正负情况分别进行了处理,每次处理2个像素,速度相当快,比常规BASM代码的亮度处理过程还要快几倍(参见《GDI+ 在Delphi程序的应用 -- 调整图像亮度》)。
三、图像亮度/对比度综合调整算法。这个很简单,当亮度、对比度同时调整时,如果对比度大于0,现调整亮度,再调整对比度;当对比度小于0时,则相反,先调整对比度,再调整亮度。
亮度对比度的算法公式
一副图像的亮度对比度调节属于图像的灰度线性变换,其公式如下:
y = [x - 127.5 * (1 - B)] * k + 127.5 * (1 + B);
x为调节前的像素值,y为调节后的像素值。
其中B取值[-1,1],调节亮度;
k调节对比度,arctan(k)取值[1,89],所以
k = tan( (45 + 44 * c) / 180 * pi );
其中c取值[-1,1]。通常我们用该值来设置对比度
特别的,
当B=0 时:y = (x - 127.5) * k + 127.5; 这时只调节对比度。
当c=0 时,k = 1:y = x + 255 * B; 这时只调节亮度。
- 图像编辑之对比度调整(亮度对比度的算法公式)
- 图像编辑之对比度调整(亮度对比度的算法公式) .
- 图像编辑之对比度调整(亮度对比度的算法公式)
- 图像编辑之对比度调整(亮度对比度的算法公式)
- 像素亮度对比度的算法公式
- 图像亮度/对比度的调整
- 亮度/对比度调整 参考
- 调整对比度及亮度
- opencv学习笔记之调整图像的亮度与对比度
- 图像处理之调整亮度与对比度
- 图像处理之调整亮度与对比度
- 【学习OpenCV】图像的亮度/对比度调整
- Opencv图像对比度和亮度的调整
- OpenCV-调整图像的对比度、亮度
- Photoshop图像亮度/对比度调整
- Photoshop图像亮度/对比度调整
- 图像对比度、亮度值调整
- chapter12_1对比度与亮度调整
- 云计算的概念,发展现状,实现机制,Google云计算原理
- 打表研究
- WinCE 基于Wlan的TCP/IP通信
- IOS获取视频缩略图
- C#打开文件夹
- 图像编辑之对比度调整(亮度对比度的算法公式)
- uboot 学习
- 尼姆博弈————(杭电2176题)可以做!
- 高新技术知识点总结01
- MySQL分区琐碎
- Ext.net 往后台传递参数
- Raspberry Pi(树莓派)试用小记
- 如何用SQLPLUS远程登服务器?
- 高新技术知识点总结02